当前位置:首页 > 力扣 > LeetCode 2778题解:平方和的高效计算与因数遍历优化(C++实现)

LeetCode 2778题解:平方和的高效计算与因数遍历优化(C++实现)

2个月前 (07-06)

LeetCode 2778题解:平方和的高效计算与因数遍历优化(C++实现)  力扣 第1张

一、题目解读

LeetCode 2778题要求计算数组中下标为n的因数的元素的平方和。例如,若n=6,其因数为1、2、3、6,则需计算nums[0]、nums[1]、nums[2]、nums[5]的平方和。题目关键在于高效识别因数并避免重复计算。

二、解题思路

代码采用因数遍历策略:通过循环遍历n的所有因数(1到n),利用n的因数特性(成对出现)减少遍历次数。当检测到i是n的因数时,直接访问对应下标元素(需注意数组下标从0开始,而题目要求从1开始,故实际下标为i-1),计算平方并累加。该解法核心在于将时间复杂度从O(n²)优化至O(√n),大幅提升效率。

三、解题步骤

1. 初始化:获取数组长度n,创建变量sum初始化为0。

2. 因数遍历:循环i从1到n,判断n是否能被i整除(即n%i==0)。

3. 平方累加:若i是因数,则计算nums[i-1]的平方并加入sum(注意下标转换)。

4. 返回结果:循环结束后,sum即为所有目标元素的平方和。

四、代码与注释

class Solution {  
public:  
    int sumOfSquares(vector<int>& nums) {  
        int n = nums.size();  // 获取数组长度  
        int sum = 0;          // 初始化平方和为0  
        
        // 遍历数组,注意题目要求下标从1开始  
        for(int i = 1; i <= n; i++) {  
            // 检查当前下标是否是特殊元素(即n的因数)  
            if(n % i == 0) {  
                // 计算平方并累加(注意数组实际下标是i-1)  
                sum += nums[i-1] * nums[i-1];  
            }  
        }  
        
        return sum;  // 返回最终平方和  
    }  
};

注释说明:

● 循环条件i从1到n,利用n的因数对称性,仅遍历至√n即可覆盖所有因数对。

● 通过n%i==0快速判断因数,避免复杂求根运算。

● 下标转换i-1确保符合题目“下标从1开始”的要求,同时利用数组0索引特性。

五、总结

该解法通过因数遍历与下标转换,将问题转化为线性时间复杂度求解,避免了暴力枚举的冗余计算。核心技巧在于利用数学因数特性减少循环次数,并通过简洁的代码实现高效处理。适用于大规模数组场景,兼顾时间与空间效率,是解决此类问题的经典优化思路。

参考:力扣2778题解

原创内容 转载请注明出处

标签: LeetCode力扣
分享给朋友:

相关文章

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

一、题目解读LeetCode 2523题要求在一个给定的整数区间 [left, right] 内,找到间隔最小的两个质数(即相邻质数的差值最小),并返回这对质数。若区间内不存在两个质数,则返回 [-1...

LeetCode 1031题解析:不重叠子数组最大和的解法(前缀和+动态规划)

LeetCode 1031题解析:不重叠子数组最大和的解法(前缀和+动态规划)

一、题目解读LeetCode 1031题要求在不重叠的前提下,从给定数组nums中寻找两个长度分别为firstLen和secondLen的连续子数组,使其和最大。题目强调子数组必须不重叠,即两个子数组...

LeetCode 2466题解:统计构造好字符串的方案数(动态规划+模运算)

LeetCode 2466题解:统计构造好字符串的方案数(动态规划+模运算)

一、题目解读LeetCode 2466题要求统计在长度范围 [low, high] 内,由字符 '0' 和 '1' 构成的“好字符串”数量。好字符串定义为:每次可添加...

LeetCode 2576题解:双指针法求解最多标记下标(排序+贪心策略)

LeetCode 2576题解:双指针法求解最多标记下标(排序+贪心策略)

一、题目解读LeetCode 2576题要求在一个整数数组中寻找最多可标记的下标对:若 nums[i] * 2 <= nums[j](i ≠ j),则下标 i 和 j 可配对标记。例如,输入 [...

LeetCode 2074题解:反转链表中的节点间隔(虚拟节点+分组反转)

LeetCode 2074题解:反转链表中的节点间隔(虚拟节点+分组反转)

一、题目解读LeetCode 2074题要求对链表进行分组反转:将链表按节点数分组,若当前组长度为偶数则反转该组节点,奇数长度则保持不变。例如,输入链表 [1,2,3,4,5,6],分组后 [1,2,...

LeetCode 2309题解:寻找字符串中的最大字母(哈希表+字符转换)

LeetCode 2309题解:寻找字符串中的最大字母(哈希表+字符转换)

一、题目解读LeetCode 2309题要求在一个仅含小写和/或大写英文字母的字符串中,找出满足以下条件的最大字母:该字母的大写和小写形式均出现在字符串中。例如,若输入 "aAbBcC&qu...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。