2021-12-31每日刷题打卡

这篇博客探讨了三个算法问题:如何检查完美数,如何构造最大的整数以及如何找到最长数对链。针对完美数,通过计算其因子总和判断;最大数则通过自定义排序规则进行字符串拼接;最长数对链利用贪心策略,按数对的第二个元素排序并构建链。
摘要由CSDN通过智能技术生成

2021-12-31每日刷题打卡

507. 完美数

对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。

给定一个 整数 n, 如果是完美数,返回 true,否则返回 false

示例 1:

输入:num = 28
输出:true
解释:28 = 1 + 2 + 4 + 7 + 14
1, 2, 4, 7, 和 14 是 28 的所有正因子。

提示:

  • 1 <= num <= 108

这题就是枚举出num的因数,然后全部相加看是不是和num相同。但要是直接用for用1遍历到num会超时的(num最大开到了10^8),所以不能直接枚举到num,但也不用枚举到num,一个数最大的因数就是它的平方根,只要开到它的平方根就可以了,然后每次把因数i和num/i都加起来即可。

class Solution {
public:
    bool checkPerfectNumber(int num) {
        if(num==1)return false;
        int sum=1,n=num;
        for(int i=2;i<n;i++)
            if(num%i==0)
            {
                sum+=i;
                sum+=num/i;
                n=num/i;
            }
        return sum==num;
    }
};
179. 最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1:

输入:nums = [10,2]
输出:“210”

设置一个自定义排序规则,判断是b拼接在a后面大还是a拼接在b后面大,哪个大就按照那个顺序来排列,有一点注意的是,如果排序后首个元素是0,说明这个数组里全是0,而如果有多个0的话,拼接起来会是00000,但我们只用返回一个0,所以排序后判断一下首元素是否是0,如果是0就返回一个0。不是0就把所有的字符串拼接起来。

class Solution {
public:
    static bool cmp(const string &a,const string &b)
    {
        string str1=a+b,str2=b+a;
        return str1>str2;
    }
    string largestNumber(vector<int>& nums) {
        vector<string>v;
        for(auto i:nums)
            v.push_back(to_string(i));
        sort(v.begin(),v.end(),cmp);
        if(v[0]=="0")return "0";
        string str;
        for(auto i:v)
            str+=i;
        return str;
    }
};
646. 最长数对链

给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。

现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。

给定一个数对集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。

示例:

输入:[[1,2], [2,3], [3,4]]
输出:2
解释:最长的数对链是 [1,2] -> [3,4]

提示:

给出数对的个数在 [1, 1000] 范围内。

贪心写法,自定义排序规则,以数对的第二个元素为基准升序排列,然后遍历pair,先设定变量r为第一个数对的右元素,ans=1计算数对长度,每次判断到pair[i] [0]>r,ans就++,并且r更新为当前数对的右元素,最后返回ans。

class Solution {
public:
    static bool cmp(const vector<int>&a,const vector<int>&b)
    {
        return a[1]<b[1];
    }
    int findLongestChain(vector<vector<int>>& pairs) {
        sort(pairs.begin(),pairs.end(),cmp);
        int r=pairs[0][1],ans=1;
        for(auto i:pairs)
        {
            if(i[0]>r)
            {
                ans++;
                r=i[1];
            }
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值