力扣--1390. 四因数(中等题)--枚举法
作者:互联网
力扣--1390. 四因数(中等题)
这题也是找规律。
【题目描述】
给你一个整数数组 nums,请你返回该数组中恰有四个因数的这些整数的各因数之和。
如果数组中不存在满足题意的整数,则返回 0 。
【示例】
示例:
输入:nums = [21,4,7]
输出:32
解释:
21 有 4 个因数:1, 3, 7, 21
4 有 3 个因数:1, 2, 4
7 有 2 个因数:1, 7
答案仅为 21 的所有因数的和。
提示:
1 ≤ n u m s . l e n g t h ≤ 1 0 4 1 \le nums.length \le 10^4 1≤nums.length≤104
1 ≤ n u m s [ i ] ≤ 1 0 5 1 \le nums[i] \le 10^5 1≤nums[i]≤105
【解题过程】
【思路】
就是先找所有数字的因数,如果因数的个数恰好为4,就加到答案里面。
【代码】
根据上面的思路,写出了第一个版本的代码:
#include<cmath>
class Solution {
public:
//找出n的因数的函数
vector<int> findDivisors(int n){
vector<int> divisors;
for(int i=1;i<=sqrt(n);i++)
{
if(n%i==0){
if(!(count(divisors.begin(), divisors.end(), i)) && !(count(divisors.begin(), divisors.end(), n/i)) && (i!=n/i))
{
divisors.push_back(i);
divisors.push_back(n/i);
}
else if(!(count(divisors.begin(), divisors.end(), i)) && !(count(divisors.begin(), divisors.end(), n/i)) && (i==n/i)){
divisors.push_back(i);
}
}
}
return divisors;
}
int sumFourDivisors(vector<int>& nums) {
int ans=0;
for(int i=0;i<nums.size();i++){
vector<int> div=findDivisors(nums[i]);
if(div.size()==4){
ans=ans+div[0]+div[1]+div[2]+div[3];
}
}
return ans;
}
};
运行结果:
这个代码,时间空间复杂度都比较高。所以看了官方解答之后修改了一下。
【改进版代码】
#include<cmath>
class Solution {
public:
int sumFourDivisors(vector<int>& nums) {
int ans=0;
for(int i=0;i<nums.size();i++){
int count=0;
int sum_4=0;
for(int j=1;j<=sqrt(nums[i]);j++){
if(nums[i]%j==0){
++count;
sum_4+=j;
if(j!=(nums[i]/j)){
sum_4+=(nums[i]/j);
++count;
}
}
if(count>4){
break;
}
}
if(count==4){
ans+=sum_4;
}
}
return ans;
}
};
修改后依然可以通过。剪掉了用于存因数的数组,降低空间消耗,并且在count>4的时候,及时跳出循环,从而减少时间消耗。
标签:le,枚举法,nums,--,力扣,int,因数,ans,div 来源: https://blog.csdn.net/Catherinyy/article/details/115015081