1.題目介紹
題目地址(697. 陣列的度 - 力扣(LeetCode))
https://leetcode.cn/problems/degree-of-an-array/
題目描述
給定一個非空且只包含非負數的整數陣列 nums
,陣列的 度 的定義是指陣列裡任一元素出現頻數的最大值。
你的任務是在 nums
中找到與 nums
擁有相同大小的度的最短連續子陣列,返回其長度。
示例 1:
輸入:nums = [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:
輸入:nums = [1,2,2,3,1,4,2] 輸出:6 解釋: 陣列的度是 3 ,因為元素 2 重複出現 3 次。 所以 [2,2,3,1,4,2] 是最短子陣列,因此返回 6 。
提示:
nums.length
在1
到50,000
範圍內。nums[i]
是一個在0
到49,999
範圍內的整數。
2.題解
2.1 雜湊表
思路
key值儲存元素值, value儲存一個數值,有三個值,分別儲存出現次數,出現位置和結束位置
程式碼
class Solution {
public:
int findShortestSubArray(vector<int>& nums) {
unordered_map<int, vector<int>> mp;
for(int i = 0; i < nums.size(); i++){
int num = nums[i];
if(mp.count(num)){
mp[num][0]++;
mp[num][2] = i;
}
… minLen = mp[num][2] - mp[num][1] + 1;
} else if(mp[num][0] == maxNum){
minLen = min(minLen, mp[num][2] - mp[num][1] + 1);
}
}
return minLen;
}
};
複雜度分析
令 n 為陣列長度。
- 時間複雜度:\(O(n)\)
- 空間複雜度:\(O(n)\)