数组的度
//给定一个非空且只包含非负数的整数数组?nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。
//你的任务是在 nums 中找到与?nums?拥有相同大小的度的最短连续子数组,返回其长度。
#include <stdio.h>
#define Max_N 50001
int findShortestSubArray(int* num, int numsSize);
int main()
{
int num[7] = {1, 2, 2, 3, 1, 4, 2};
printf("%d", findShortestSubArray(num, 7));
return 0;
}
//Leetcode-697
int findShortestSubArray(int* num, int numsSize)
{
int cnt[Max_N] = {0};
int range[Max_N][2];
memset(range, -1, sizeof(range));
//统计所有数的第一次和最后一次+1的索引值
for(int i = 0; i < numsSize; i++)
{
cnt[num[i]]++;
if(range[num[i]][0] == -1)
{
range[num[i]][0] = i;
}
range[num[i]][1] = i + 1;
}
//已经排好序 找出出现次数最多 索引最小的数
int mx = 0; //记录最大出现次数
int ans = numsSize;
for(int i = 0; i < numsSize; i++)
{
//如果大于等于最大次数 重新对ans最小距离赋值
if(cnt[num[i]] >= mx)
{
int len = range[num[i]][1] - range[num[i]][0];
//如果大于最大次数 重新对最大次数和ans最小距离赋值
if(cnt[num[i]] > mx)
{
mx = cnt[num[i]];
ans = len;
}
else
{
ans = len <= ans ? len : ans;
}
}
}
return ans;
}