寫在前面
- 難度:簡單,,,
- 注意事項:
連續子序列(1開始沒理解1臉懵逼)
- 核心思想
unordered_map<int, vector<int>>
- 元素值作爲key
- 元素在數組中的下標存儲爲
vector<int>
- vector是一種順序容器
- 順序容器指的是元素排列次序與元素的值無關,而是由元素添加到容器裏的次序決定
題目詳情
給定一個非空且只包含非負數的整數數組 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範圍內的整數。
ac代碼
- 算法思想
- 循環計算元素頻數最大值
- 頻數較大,更新最短子序列值
- 頻數相等,子序列較短則更新子序列值
class Solution
{
public:
int findShortestSubArray(vector<int> & nums)
{
unordered_map<int, vector<int>> umap;
int n = nums.size();
for(int i=0; i<n; i++)
umap[nums[i]].push_back(i);
int msqLen = 1000000;
int cnt = 0;
for(auto it=umap.begin(); it!=umap.end(); it++)
{
int pcnt = it->second.size();
if(pcnt > cnt)
{
cnt = it->second.size();
msqLen = it->second[pcnt-1] - it->second[0] + 1;
}
if(pcnt == cnt)
{
if(msqLen > it->second[pcnt-1]-it->second[0] + 1)
msqLen = it->second[pcnt-1]-it->second[0] + 1;
}
}
return msqLen;
}
};