LeetCode_697_数组_数组的度
Posted 軒邈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode_697_数组_数组的度相关的知识,希望对你有一定的参考价值。
原创:
/*
理解:
1.非空 且包含 非负数 的 整数 数组nums;
2.数组中“度”的定义,是数组中某个元素重复出现次数的最大值;
3.任务:假设重复的次数最大值为a,在含有度为 a 的该数组的连续数子数组,找到最短的那一个数组,并且返回该数组的长度。
思路:
1.先将nums数组的每一个值当作iArry这个数组的下标,相同下标对应的元素加一;
2.然后通过对iArry数组的遍历得到nums数组的度;
3.因为在nums这个数组中满足度的元素不止一个,所以我通过遍历数组nums找到该度的元素并且将其存入到数组中;
4.最后通过双循环,外循环遍历度的数组,内循环找到起始度的下边和结束度的下标,求解两者之间的间隔,比较大小,得出最终的最小的间隔。
*/
int findShortestSubArray(int* nums, int numsSize)
int iArry[50000] = 0; /* 初始化数组元素都为0 */
int iDegree = 0, iTempDegree = 0; /* 初始化度 和 临时度 */
int iDgreeMaxArry[50000] = 0; /* 存放元素为度的元素的值,因为为度的元素不止一个 */
int iDegreeNum = 0; /* 存放为度元素的下标 */
int iStartDegree = 0, iFinishDegree = 0, iDegreeLenth = 50000, iTempDegreeLenth = 0; /* 度的起始值 结束值 间隔长度 临时间隔长度 */
bool bStartFlag = false; /* 起始度的第一次进入判断的标志位 */
for(int i = 0; i < numsSize; i++ )
iArry[nums[i]] += 1; /* 在 nums 这个数组中元素值有1 iArry 这个数组对应的下标的赋值 1 */
for(int i = 0; i < 50000; i++ )
iTempDegree = iArry[i];
if(iTempDegree > iDegree) /* 通过判断找到该数组的度 */
iDegree = iTempDegree;
int j = 0;
while(j < 50000) /* 找到为度的元素并,因为为度的元素不止一个,所以均存入到数组中 */
if(iArry[j] == iDegree)
iDgreeMaxArry[iDegreeNum] = j; /* 因为此时 j 就是为度的元素 */
iDegreeNum ++;
j++;
for(int i = 0; i < iDegreeNum; i++ ) /* 外循环遍历有度的元素 */
for(int j = 0; j < numsSize; j++ ) /* 内循环遍历 nums 数组,找到度的起始位置和结束位置 */
if(nums[j] == iDgreeMaxArry[i])
if(!bStartFlag) /* 第一次进入判断标志位 */
iStartDegree = j;
bStartFlag = true; /* 标志位赋值为真,防止下次继续进入,以及 j 本身等于 0 的情况 */
iFinishDegree = iStartDegree; /* 防止度为 1 时,并且只有两个元素,那么会出现起始度为1,结束度为0的情况,则最后间隔的结果是0,不符合题意 */
else
if(j > iFinishDegree) /* 除了第一次进入判断后,其余进入判断后得到结束度 */
iFinishDegree = j;
iTempDegreeLenth = iFinishDegree - iStartDegree + 1;
if(iTempDegreeLenth < iDegreeLenth) /* 通过判断得到最小的间隔情况 */
iDegreeLenth = iTempDegreeLenth;
iFinishDegree = iStartDegree = iTempDegreeLenth = 0;
bStartFlag = false;
return iDegreeLenth;
总结:
发扬自己的优点,弥补自己的缺点!
以上是关于LeetCode_697_数组_数组的度的主要内容,如果未能解决你的问题,请参考以下文章