本文已参与[新人创作礼]活动,一起开启掘金创作之路。
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;
}
};