[LeetCode]Degree of an Array

题目:求一个数组的度,即求数组中最短子数组的长度使其数字的最大频度等于原数组数字的最大频度
要求:数组长度1~50000,数组中数范围0~49999
例如:输入: [1, 2, 2, 3, 1],输出: 2
解析: 数字1和数字2都出现了两次,我们需要找出包含1或2出现两次的子数组。有以下:[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
因此最短长度为2.
思路:因为数组长度和数组中数范围,可以定义一个长度为50000的数组存储数组中每个数字出现的频度,即int length[50000],nums数组的值对应length数组的索引值。
eg,对应上边的例子,length数组的值为,length[1]=2,length[2]=2,length[3]=1,length[4]=1。按照这个思路再定义两个一维数组分别存储每个数字的最大索引max_index[50000]和最小索引min_index[50000]。

最大频度,开始索引和结束索引值找到后,接下来只需要遍历nums数组,判断length[nums[i]]是否等于最大频度,若大于则shortest=max_index[nums[i]]-min_index[nums[i]],更新最小长度

C++代码:

class Solution {
public:
	int findShortestSubArray(vector<int>& nums) {
		int temp[50000] = { 0 };
		int max[50000] = { 0 };
		int min[50000] = { 0 };
		int minlen =0;
		for (int i = 0; i < nums.size(); i++)
		{
			
			if (temp[nums[i]] == 0)
				min[nums[i]] = i;
			max[nums[i]] = i;
			temp[nums[i]]++;
			if (temp[nums[i]]>minlen)
			{
				minlen = temp[nums[i]];
			}	
		}
		int shortest = 0;
		int len = nums.size();
		for (int i = 0; i < nums.size(); i++)
		{
			if (temp[nums[i]] == minlen)
			{
				shortest = max[nums[i]] - min[nums[i]]+1;
				if (shortest< len)
					len = shortest;
			}
				
		}
		return len;
			
		}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值