LeetCode 1390.四因数:因数分解+缓存

【LetMeFly】1390.四因数:因数分解+缓存

力扣题目链接:https://leetcode.cn/problems/four-divisors/

给你一个整数数组 nums,请你返回该数组中恰有四个因数的这些整数的各因数之和。如果数组中不存在满足题意的整数,则返回 0 。

示例 1:

复制代码
输入:nums = [21,4,7]
输出:32
解释:
21 有 4 个因数:1, 3, 7, 21
4 有 3 个因数:1, 2, 4
7 有 2 个因数:1, 7
答案仅为 21 的所有因数的和。

示例 2:

复制代码
输入: nums = [21,21]
输出: 64

示例 3:

复制代码
输入: nums = [1,2,3,4,5]
输出: 0

提示:

  • 1 <= nums.length <= 104
  • 1 <= nums[i] <= 105

解题方法:因数分解

如何求一个数 n n n有多少个因数?

用变量 i i i从 1 1 1到 ⌊ n ⌋ \lfloor\sqrt{n}\rfloor ⌊n ⌋遍历,如果 i i i能整除 n n n,则因数个数加二。

特别的,如果 n n n是完全平方数,则前面运算中 n \sqrt{n} n 多统计了一次,要减去。

由于不同的测试用例可能会出现相同的数,所以可以使用一个"全局"缓存或类中的静态变量来避免重复计算。

  • 时间复杂度:单个测试用例 O ( n ) O(n) O(n),所有测试用例总体还需加上 O ( m log ⁡ m ) O(m\log m) O(mlogm),其中 m = max ⁡ ( n u m s i ) m=\max(numsi) m=max(numsi)
  • 空间复杂度 O ( m ) O(m) O(m)

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-01-04 18:51:38
 */
class Solution {
private:
    static unordered_map<int, int> cache;

    int gen(int n) {
        if (cache.count(n)) {
            return cache[n];
        }

        int cnt = 0, sum = 0;
        int k = sqrt(n);
        for (int i = 1; i <= k; i++) {
            if (n % i == 0) {
                cnt += 2;
                sum += i + n / i;
            }
        }
        if (k * k == n) {
            cnt--, sum -= k;
        }
        return cache[n] = cnt == 4 ? sum : 0;
    }
public:
    int sumFourDivisors(vector<int>& nums) {
        int ans = 0;
        for (int t : nums) {
            ans += gen(t);
        }
        return ans;
    }
};

unordered_map<int, int> Solution::cache;

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
文丑颜不良啊7 分钟前
LeetCode2861~2880题目解析
java·leetcode
青少儿编程课堂32 分钟前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
在所不辞兄1 小时前
为什么在新能源汽车电驱与热管理开发中,AI驱动的数字孪生和数据驱动仿真正在部分替代对物理台架与实车标定的依赖?
人工智能·深度学习·神经网络·算法·机器学习
I_belong_to_jesus11 小时前
C++关于分支预测的优化1
开发语言·c++·算法
威嵌神州13 小时前
嵌入式排故实录:高并发下串口数据“超时丢包”的根因剖析与架构优化
运维·服务器·嵌入式硬件·缓存
Code_Solitude18 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司19 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
文丑颜不良啊20 小时前
LeetCode2821~2840题目解析
java·leetcode
YLCHUP21 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论