力扣--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 1nums.length104
1 ≤ n u m s [ i ] ≤ 1 0 5 1 \le nums[i] \le 10^5 1nums[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的时候,及时跳出循环,从而减少时间消耗。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一颗小芋圆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值