給定乙個非空且只包含非負數的整數陣列 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.
解題思路:
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 = new hashmap<>();
// map2用來記錄陣列中元素第一次出現時的位置(索引)
// 比如題中:1 -> 0 (陣列中1第一次出現的位置是0)
// 2 -> 1 (陣列中2第一次出現的位置是1)
// 3 -> 3 (陣列中3第一次出現的位置是3)
mapmap2 = new hashmap<>();
// map3用來記錄陣列相同元素,第一次出現與最後一次出現之間的長度
// 比如題中:元素1第一次出現的位置是0,最後一次出現的位置是4,它們之間的長度 = 5
// 元素2第一次出現的位置是1,最後一次出現的位置是2,它們之間的長度 = 3
// 元素3第一次出現的位置是3,最後一次出現的位置是3,它們之間的長度 = 1
mapmap3 = new hashmap<>();
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;}}
資料結構與演算法 12爬樓梯
description 爬樓梯的時候,設每次可以上一級台階或者兩級台階,計算上 n 級台階的方案數。input 輸入包含多組測試資料,對於每組測試資料 輸入只有一行為乙個正整數 n 1 n 50 output 對於每組測試資料,輸出符合條件的方案數。注意 64 bit 整型請使用 long long...
python爬樓梯遞迴 爬樓梯(Python3)
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 和 2 階 解題思路 實現了兩種方法,但是第一種超出時間限制 因為遞迴的時候方...
python爬樓梯演算法 爬樓梯(Python3)
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 和 2 階 解題思路 實現了兩種方法,但是第一種超出時間限制 因為遞迴的時候方...