哈希表——20200103

2 Leetcode697.数组的度
2.1 题目描述
给定一个非空且只包含非负数的整数数组 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范围内的整数。
2.2 分析
采用类似哈希的思想,由于数值的范围在0 – 49999,因此可以使用50000大小的数组存储。
2.3 代码
int findShortestSubArray(int* nums, int numsSize){
int i = 0, j = 0, k = 0;
if(numsSize == 1) {
return 1;
}

int numSet[50000] = {0}; //记录数字的次数
int left[50000] = {0}; //记录数字第一次出现的位置
int right[50000] = {0}; //记录数字最后一出现的位置
int maxCnt = INT_MIN; //最大次数
int result = INT_MAX;

for(i = 0; i < numsSize; i++) {
    numSet[nums[i]]++;
    if(numSet[nums[i]] == 1) {
        left[nums[i]] = i;
        right[nums[i]] = i; //这里需要right也赋值
    }
    else {
        right[nums[i]] = i;
    }

    maxCnt = maxCnt > numSet[nums[i]] ? maxCnt : numSet[nums[i]];
}

for(i = 0; i < 50000; i++) {
    if(numSet[i] == maxCnt) {
        result = result < (right[i] - left[i] + 1) ? result : (right[i] - left[i] + 1);
    }
}

return result;

}

发布了39 篇原创文章 · 获赞 1 · 访问量 856

猜你喜欢

转载自blog.csdn.net/weixin_42268479/article/details/103819739