難度:簡單
給定乙個非空且只包含非負數的整數陣列 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.
示例 2:
輸入:[1
,2,2
,3,1
,4,2
]輸出:
6
注意:
nums.length 在1到50,000區間範圍內。
nums[i] 是乙個在0到49,999範圍內的整數。
//方法一
class
solution
// 1、如果陣列就1個元素,陣列的度就是1,
// 2、包含這個度1的陣列長度的最小值,這個陣列長度本身了,就是這個1,因此返回1
if(nums.length ==1)
// map1用來統計陣列中每個元素出現的次數
// 比如題中:1 -> 2 (陣列中1出現了2次)
// 2 -> 2 (陣列中2出現了2次)
// 3 -> 1 (陣列中3出現了1次)
mapmap1 =
newhashmap
<
>()
;// map2用來記錄陣列中元素第一次出現時的位置(索引)
// 比如題中:1 -> 0 (陣列中1第一次出現的位置是0)
// 2 -> 1 (陣列中2第一次出現的位置是1)
// 3 -> 3 (陣列中3第一次出現的位置是3)
mapmap2 =
newhashmap
<
>()
;// map3用來記錄陣列相同元素,第一次出現與最後一次出現之間的長度
// 比如題中:元素1第一次出現的位置是0,最後一次出現的位置是4,它們之間的長度 = 5
// 元素2第一次出現的位置是1,最後一次出現的位置是2,它們之間的長度 = 3
// 元素3第一次出現的位置是3,最後一次出現的位置是3,它們之間的長度 = 1
mapmap3 =
newhashmap
<
>()
;for
(int i =
0; i < nums.length; i++
)// map3用來記錄陣列相同元素,第一次出現與最後一次出現之間的長度,key = 陣列元素, value = 第一次出現與最後一次出現之間的長度
// 陣列元素第一次出現的位置儲存在map2中,可以從裡面拿出來
map3.
put(nums[i]
,i - map2.
get(nums[i])+
1);}
// maxcount用來記錄陣列的度
int maxcount =0;
// map1中存了陣列元素的次數,將出現次數的最大值取出來,放到maxcount中
for(
int num : map1.
values()
)// minlength用來記錄最終的答案,儲存最短連續子陣列的長度,初始化為最大值
// minlength是用來儲存最小值的,將其初始化為最大值,才能不斷更新,得到更小的,再更新得到更小的,最終得到的是最小的
int minlength = integer.max_value;
for(
int key : map1.
keyset()
)}return minlength;}}
19/
LeetCode學習記錄(4 6)
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...
LeetCode學習記錄(10)
給定乙個字串 s 和乙個字元模式 實現支援 和 的正規表示式匹配。匹配任意單個字元。匹配零個或多個前面的元素。匹配應該覆蓋整個字串 s 而不是部分字串。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例 1 輸入 s aa p a 輸...
LeetCode學習記錄(5) 每日溫度
根據每日氣溫列表,請重新生成乙個列表,對應位置的輸入是你需要再等待多久溫度才會公升高的天數。如果之後都不會公升高,請輸入0來代替。例如,給定乙個列表temperatures 73,74,75,71,69,72,76,73 你的輸出應該是 1,1,4,2,1,1,0,0 氣溫列表長度的範圍是 1,30...