697 陣列的度(陣列的遍歷)

2021-10-19 14:41:16 字數 1826 閱讀 9360

給定乙個非空且只包含非負數的整數陣列 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,2,2,3,1,4,2]

輸出:6

1.記錄 nums 陣列中每個元素出現的次數得到 numstime 陣列(numstime[i]:表示元素 i 在 nums 陣列**現的次數),根據每個元素出現的次數遍歷 numstime 找到最大值,即為 nums 陣列的度。

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擁有相同大小的度的最短連續子陣列,其長度...