leetcode力扣刷题打卡
**题目:697. 数组的度
**
描述:给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。
你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
解题思路
1、先找出数组的度,即数字重复出现次数的最大值;
2、同时记录每个数字第一次出现的位置start,以及最后一次出现的位置end, end - start + 1就是子数组长度;
3、因此需要定义三个unordered_map,用来统计start, end,以及cnt(出现次数);
4、或者用一个unordered_map,定义一个三维数组。
原代码##
class Solution {
public:
int findShortestSubArray(vector<int>& nums) {
unordered_map<int, int>start, end, cnt;
int n = nums.size(), maxn = 0, ans = n;
for (int i = 0; i < n; ++i) {
if (!cnt.count(nums[i])) {
start[nums[i]] = i;
}
cnt[nums[i]]++;
end[nums[i]] = i;
maxn = max(maxn, cnt[nums[i]]);
}
//cout << maxn << endl;
for (int i = 0; i < n; ++i) {
if (cnt[nums[i]] == maxn) {
ans = min(ans, end[nums[i]] - start[nums[i]] + 1);
}
}
return ans;
}
};
或者
class Solution {
public:
int findShortestSubArray(vector<int>& nums) {
unordered_map<int, vector<int>>vm;
int n = nums.size(), maxn = 0, ans = n;
for (int i = 0; i < n; ++i) {
if (vm.count(nums[i]) > 0) {
vm[nums[i]][1] = i;
vm[nums[i]][2]++;
} else {
vm[nums[i]] = {i, i, 1};
}
maxn = max(maxn, vm[nums[i]][2]);
}
for (int i = 0; i < n; ++i) {
if (vm[nums[i]][2] == maxn) {
ans = min(ans, vm[nums[i]][1] - vm[nums[i]][0] + 1);
}
}
return ans;
}
};