LeetCode_414_数组_第三大的数

在这里插入图片描述

原创:

int thirdMax(int* nums, int numsSize)
{
    int iThirdMaxNum = 0, iThirdMaxTampNum = 0; /* 最终第三大的数,临时第三大的数 */
    int iSameValCnt = 0; /* 相同数组值计数 */
    int iChangeValCnt = 0; /* 数组值的改变次数 */
    int i = 0;

    if(numsSize <= 2 && numsSize >= 1) /* 数组长度为 1 */
    {
        if(numsSize == 1)
        {
            iThirdMaxTampNum = nums[0]; /* 第三大数为 i = 0 时的值 */
        }
        else 
        {
            iThirdMaxTampNum = (int)fmax(nums[numsSize - 1], nums[numsSize - 2]); /* 比较第 numsSize 和第 numsSize-1 的数组值,返回最大值 */
        }
        iThirdMaxNum = iThirdMaxTampNum;
    }
    else 
    {
        for (int i = 0; i < numsSize - 1; i++) /* 冒泡排序完成 */
        {
            for (int j = i; j < numsSize - 1; j++)
            {
                if (nums[i] < nums[j + 1])    /* 降序 */
                {
                    iThirdMaxTampNum = nums[i];
                    nums[i] = nums[j + 1];
                    nums[j + 1] = iThirdMaxTampNum;
                }
            }
        }

        if(numsSize == 3) /* 如果数组的长度在 3 以内 */
        {
            if(nums[0] == nums[1] && nums[0] == nums[2] && nums[1] == nums[2]) /* 数组的值均相同 */
            {
                iThirdMaxNum = nums[0];
            }
            else if(nums[0] != nums[1] && nums[0] != nums[2] && nums[1] != nums[2]) /* 数组的值均不相同 */
            {
                iThirdMaxNum = nums[2];
            }
            else /* 221 或者 322 样式的,无论怎么样都是第 0 的数组值最大 */
            {
                iThirdMaxNum = nums[0];
            }
        }
        else /* 如果数组的长度在 >3  */
        {
            for(int i = 1; i < numsSize; i++ ) /* 先将变化了多少次的值求出来 */
            {
                if(nums[i] != nums[i - 1]) /* 后面数组值与前面数组值不相等 */
                {
                    iSameValCnt ++;
                }
            }

            if(iSameValCnt == 0) /* 数组的值全部不相同 */
            {
                iThirdMaxNum = nums[2]; /* 全部不相同,那么选第一个数组值就可以 */
            }
            else if(iSameValCnt == 1) /* 数组值变化一次 */
            {
                iThirdMaxNum = nums[0]; /* 说明就两种值,那么选第一个数组值就可以 */
            }
            else if(iSameValCnt >= 2)  /* 如果数组值的变化大于2 */
            {
                while(iChangeValCnt != 2) /* 只需要找到第三大的数组值就可以 */
                {
                    i ++;
                    if(nums[i] != nums[i - 1])
                    {
                        iChangeValCnt ++;
                    }
                }

                iThirdMaxNum = nums[i];
            }
        }
    }

    return iThirdMaxNum;
}

在这里插入图片描述

借鉴:

int cmp(const void *a, const void *b){			//按降序排序
    return (*(int*)b > *(int*)a);
}

int thirdMax(int* nums, int numsSize){
  	int count = 1, i;							//count用来记录第几大的数

	qsort(nums, numsSize, sizeof(nums[0]), cmp);//排序 
    for(i = 1; i < numsSize; ++i){				//遍历数组
		if(nums[i] != nums[i-1]){				//遍历元素与前一个不重复
            ++count;
            if(count == 3)						//第三大的数
            	return nums[i];
        }
    }

	return nums[0];								//无第三大的数,返回最大的数
}

修改:

/* 自创解决方法2 */
int thirdMax(int* nums, int numsSize)
{
    int iThirdMaxTampNum = 0; /* 临时第三大的数 */
    int iChangeValCnt = 1; /* 数组值的改变次数 */

    for (int i = 0; i < numsSize - 1; i++) /* 冒泡排序完成 */
    {
        for (int j = i; j < numsSize - 1; j++)
        {
            if (nums[i] < nums[j + 1])    /* 降序 */
            {
                iThirdMaxTampNum = nums[i];
                nums[i] = nums[j + 1];
                nums[j + 1] = iThirdMaxTampNum;
            }
        }
    }

    for(int i = 1; i < numsSize; i++)
    {
        if(nums[i] != nums[i - 1])
        {
            iChangeValCnt++;

            if(iChangeValCnt == 3) /* 只要找到第三大的数就返回 */
            {
                return nums[i];
            }
        }        
    }  

    return nums[0]; /* 其他的情况返回数组的第一个值 */
}

总结:

有时候在你要放弃的时候,挣扎一下,其实你就成功了!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

軒邈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值