給定一個非空且只包含非負數的整數數組 nums,數組的度的定義是指數組里任一元素出現頻數的最大值。
你的任務是在 nums 中找到與 nums 擁有相同大小的度的最短連續子數組,返回其長度。
示例 1:
輸入:[1, 2, 2, 3, 1]
輸出:2
解釋:
輸入數組的度是2,因為元素1和2的出現頻數最大,均為2.
連續子數組里面擁有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短連續子數組[2, 2]的長度為2,所以返回2.
解題思路
關鍵找到出現次數最多的元素(可能多個),相同元素的頭尾元素的距離就是與 nums 擁有相同大小的度的最短連續子數組,因為這個子數組保證涵蓋到所有的出現次數最多的元素,擁有相同大小的度。
兩個hashmap分別記錄每個數字出現的次數和第一次出現的位置,用來維護出現頻數和所能產生的子數組長度
代碼
class Solution {public int findShortestSubArray(int[] nums) {int max=-1,res=Integer.MAX_VALUE;Map<Integer,Integer> map=new HashMap<>();Map<Integer,Integer> map2=new HashMap<>();for (int i = 0; i < nums.length; i++) {map.put(nums[i],map.getOrDefault(nums[i],0)+1);if(!map2.containsKey(nums[i])) map2.put(nums[i],i);int temp= i-map2.get(nums[i])+1;if(max==-1||map.get(nums[i])>map.get(max)||nums[i]==max||(map.get(nums[i])==map.get(max)&&temp<res))
//需要替換子數組的4種情況 1.最大頻數還沒初始化2.出現更大頻數3.目前最大頻數元素的子數組長度更新4.新元素的頻數跟之前的最大頻數相同,但是生成的子數組長度更短{res=temp; max=nums[i];}}return res;}
}