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;
}

在这里插入图片描述

总结:

发扬自己的优点,弥补自己的缺点!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

軒邈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值