力扣每日一题+逐行代码分析 再迷茫也能看得懂!day2第三大的数——排序法

题目的有序集合法和原题链接都在上一篇文章里啦:

https://blog.csdn.net/edison16777/article/details/130698313?spm=1001.2014.3001.5501

今天就来讲一下第三大的数这题的第二种解法:排序法

做题前的思想:我们要得到第三大的数,那我们就把题目提供的数组从大到小排序,然后从头开始遍历如果能找到三个不同的元素,那就意味着第三大的数找到了。

那想到排序的话C++标准库中的sort函数可以帮助我们排序,但是它是从小到大排的,那我们就用降序排列,也及时从大到小排序。那现在排完序之后我们从头开始遍历,当第一个数与后面一个数不同时,计数器+1,意味着我们已经找到了两个不同的数;那只要计数器等于2,也就意味着这时候也就是已经找到三个不同的数了,那么这时返回这个数后面那个数就行啦(这边可能比较难理解,我下面会举个例子)

接下来就是把文字转换成代码了:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int thirdMax(vector<int>& nums)
{
    sort(nums.begin(),nums.end(),greater<int>());//这里的greater<int>作为sort的第三个参数,作用是使原来为升序的sort排序变为降序
    int n = nums.size();
    int cnt = 0;//新建一个计数器
    
    for (int i = 0; i < n-1; i++)
    {
      if(nums[i] != nums[i+1]) cnt++;//如果前后两数不相同,则计数器+1
      if(cnt == 2) return nums[i+1];//若计数器=2,则已经找到了三个不同的数,返回当前数后一个数                        
                                                                          //(下面会举例)
    }

   return nums[0];//这里意思是:如果上面i到不了2,也就代表着只有两个不同的数值,那么就返回最大值
}

//下面是测试样例
int main() {
    vector<int> nums = {3, 1, 3, 5, 5};
    int ans = thirdMax(nums);
    cout << "The third maximum number is: " << ans << endl;
    return 0;
}

以测试样例 数组{3,1,3,5,5} 为例,

首先先被sort倒序排序变为{5,5,3,3,1};

然后 变量i 开始遍历:

  1. nums[0] 和nums[1]相同,i++变为1;
  2. nums[1] 和nums[2]分别为5和3,不同,计数器cnt+1=1,i++变为2;
  3. nums[2] 和nums[3]分别为3和3,相同,计数器cnt不变,i++变为3;
  4. nums[3] 和nums[4]分别为3和1,不同,计数器cnt+1=2,返回nums[4](此时i=3,nums[i+1]就是nums[4])

然后就结束力!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值