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_数组_数组的度的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 697. 数组的度

LeetCode 697. 数组的度

LeetCode # Array # Easy # 697 Degree of an Array

js把循环获取到的数据分段生成几组数组?

leetcode刷题记录——数组与矩阵

697. 数组的度