您的位置:首页 > 其它

[LeetCode]Degree of an Array

2018-03-17 10:21 351 查看
题目:求一个数组的度,即求数组中最短子数组的长度使其数字的最大频度等于原数组数字的最大频度
要求:数组长度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;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: