給定乙個非空且只包含非負數的整數陣列 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.
示例 2:1.記錄 nums 陣列中每個元素出現的次數得到 numstime 陣列(numstime[i]:表示元素 i 在 nums 陣列**現的次數),根據每個元素出現的次數遍歷 numstime 找到最大值,即為 nums 陣列的度。輸入:[1,2,2,3,1,4,2]
輸出:6
2.若度為 1,則直接返回 1 不需要再進行其他的判斷了,這樣會節省時間。
3.若度不為 1,則根據度找到 nums 陣列中符合條件的元素(在 numstime 陣列中找到與 nums 陣列的度相同的元素值的下標,即為符合條件的元素),並儲存在陣列 a 中(若 0 的個數最多,則 0 一定會儲存在陣列 a 的第乙個位置(i = 0))。
4.因為 a 陣列的長度為 50001,所以沒有儲存元素的位置均為 0,為了不影響後續操作要將這些 0 都修改(因為是只包含非負數的陣列,所以值為 0 的地方均改為 -1,除了陣列 a 中的第乙個值)。若 nums 陣列中 0 的個數最多,此時,nums 陣列中的元素 0 只會儲存在陣列 a 的第乙個位置(i = 0),所以要從下標 1 開始判斷並修改。
5.遍歷陣列 a,分別從 nums 陣列的左邊和右邊再進行遍歷,找到當前 a[m] 在左邊和右邊第一次出現的位置並記錄,最後計算子陣列的長度 right - left + 1 並將 a[m] 的值覆蓋(不需要開闢新的空間了)。
6.遍歷陣列 a,找到當前陣列 a 中大於 0 的最小值,即為答案。
class
solution
for(
int i=
0;i)for
(int i=
0;iif(maxnums ==1)
for(
int i=
0;i//從1開始修改,因為有可能元素0最多,此時0一定是儲存在陣列a的開頭的
for(
int i=
1;ifor(
int m=
0;mfor(
int i=n-
1;i>=left;i--)}
a[m]
= right - left +1;
left = right =0;
}}int min = a[0]
;for
(int i=
1;ireturn min;
}}
因為 nums 陣列的長度在最壞的情況下為 n = 50001。
空間複雜度:開闢了兩個新的空間長度均為 n,所以複雜度為o(n + n) = o(2n) = o(n)。(複雜度中不把常數考慮在內)
時間複雜度:根據**複雜度為 o(2n² + 5n) = o(n²)
697 陣列的度
給定乙個非空且只包含非負數的整數陣列 nums,陣列的度的定義是指數組裡任一元素出現頻數的最大值。你的任務是找到與 nums 擁有相同大小的度的最短連續子陣列,返回其長度。示例 1 輸入 1,2,2,3,1 輸出 2 解釋 輸入陣列的度是2,因為元素1和2的出現頻數最大,均為2.連續子陣列裡面擁有相...
697 陣列的度
給定乙個非空且只包含非負數的整數陣列nums,陣列的度的定義是指數組裡任一元素出現頻數的最大值。你的任務是找到與nums擁有相同大小的度的最短連續子陣列,返回其長度。示例 1 輸入 1,2,2,3,1 輸出 2解釋 輸入陣列的度是2,因為元素1和2的出現頻數最大,均為2.連續子陣列裡面擁有相同度的有...
697 陣列的度
解題思路 最直觀最笨的方法 1.遍歷陣列,借助輔助陣列count,統計原陣列中每個元素出現的次數 2.根據count中元素額值,求出陣列的度 3.輔助二維陣列arr,初始值為 1,儲存陣列的度對應的元素的最小索引和最大索引 4.遍歷原陣列的元素,找到與nums擁有相同大小的度的最短連續子陣列,其長度...