697. 数组的度
知识点:数组
时间:2021年2月20日
题目链接
题目
给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。
你的任务是在 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 范围内的整数。
解题思路
- 题目比较简单 但是需要多读几遍 所谓度就是这个整数出现的最大频率
- 根据解释 可知 我们要找的是最大频率的整数 且占用最少多少数组
- 遍历nums数组 对其中的整数 统计开始位置、结束位置、频率
- 遍历所有整数 如果频率大于当前频率,立即更新答案
- 如果频率相等,选取占用较少的数组
代码
#include "cheader.h"
class Solution {
public:
struct node{
int start,end;
int count;
}data[50010];
int findShortestSubArray(vector<int>& nums) {
for(int i = 0; i < 50010; i++){
data[i].start = -1;
data[i].end = -1;
data[i].count = 0;
}
for(int i = 0; i < nums.size(); i++){
int x = nums[i];
if(data[x].start == -1){
data[x].start = i;
data[x].end = i;
data[x].count = 1;
}else{
data[x].end = i;
data[x].count += 1;
}
}
int ans = 50010,count_max = -1;
for(int i = 0; i < 50010; i++){
if(count_max < data[i].count){
ans = data[i].end-data[i].start+1;
count_max = data[i].count;
}
else if(count_max == data[i].count && ans > data[i].end-data[i].start+1)
ans = data[i].end-data[i].start+1;
}
return ans;
}
};
int main()
{
vector<int> nums{1,2,2,3,1};
Solution s;
cout<<s.findShortestSubArray(nums)<<endl;
return 0;
}
今天也是爱zz的一天哦!