Every day a leetcode
题目来源:697. 数组的度
解法1:哈希
我们这样构建哈希表 unordered_map<int, vector> umap:
- key:数组元素 nums[i]
- value:三元组[count, first, last],分别代表元素 nums[i] 的出现次数、第一次出现的下标和最后出现的下标。
我们遍历一次数组 nums 即可构建出该哈希表。
变量 maxTimes 记录出现频数的最大值,minLen 记录与 nums 拥有相同大小的度的最短连续子数组的长度,均初始化为 0。
遍历哈希表:
- 当 count > maxTimes 时,更新 maxTimes = count,minLen = last - first + 1;
- 当 count == maxTimes 时,只更新 minLen = min(last - first + 1, minLen);
最后的 minLen 即为答案。
代码:
/*
* @lc app=leetcode.cn id=697 lang=cpp
*
* [697] 数组的度
*/
// @lc code=start
class Solution
{
public:
int findShortestSubArray(vector<int> &nums)
{
int n = nums.size();
unordered_map<int, vector<int>> umap;
for (int i = 0; i < n; i++)
{
if (umap.count(nums[i]))
{
umap[nums[i]][0]++;
umap[nums[i]][2] = i;
}
else
umap[nums[i]] = {1, i, i};
}
int maxTimes = 0;
int minLen = 0;
for (auto it = umap.begin(); it != umap.end(); it++)
{
if (it->second[0] > maxTimes)
{
maxTimes = it->second[0];
minLen = it->second[2] - it->second[1] + 1;
}
else if (it->second[0] == maxTimes)
minLen = min(minLen, it->second[2] - it->second[1] + 1);
}
return minLen;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是原数组 nums 的长度,我们需要遍历原数组和哈希表各一次,它们的大小均为 O(n)。
空间复杂度:O(n),其中 n 是原数组 nums 的长度,最坏情况下,哈希表和原数组等大。