Easy
题目描述
给你一个下标从 1 开始、长度为 n 的整数数组 nums。
对于数组 nums 中的元素 nums[i],如果 i 能整除 n,即 n % i == 0,则认为 nums[i] 是一个 特殊元素。
返回 nums 中所有 特殊元素 的平方和。
示例 1:
输入:nums = [1,2,3,4]
输出:21
解释:nums 中共有 3 个特殊元素:nums[1],因为 1 整除 4;nums[2],因为 2 整除 4;nums[4],因为 4 整除 4。
因此,nums 中所有特殊元素的平方和等于 nums[1] * nums[1] + nums[2] * nums[2] + nums[4] * nums[4] = 1 * 1 + 2 * 2 + 4 * 4 = 21。
示例 2:
输入:nums = [2,7,1,19,18,3]
输出:63
解释:nums 中共有 4 个特殊元素:nums[1],因为 1 整除 6;nums[2],因为 2 整除 6;nums[3],因为 3 整除 6;nums[6],因为 6 整除 6。
因此,nums 中所有特殊元素的平方和等于 nums[1] * nums[1] + nums[2] * nums[2] + nums[3] * nums[3] + nums[6] * nums[6] = 2 * 2 + 7 * 7 + 1 * 1 + 3 * 3 = 63。
提示:
1 <= nums.length == n <= 501 <= nums[i] <= 50
解题思路
这是一道简单的数组遍历题目。关键是理解题意:
- 数组是 1-indexed(从索引 1 开始)
- 特殊元素的定义是:索引
i能整除数组长度n
解题思路:
由于题目给出的数组是 1-indexed,但实际编程中数组通常是 0-indexed,我们需要注意索引的转换。对于 0-indexed 数组中索引为 i 的元素,它在 1-indexed 中的位置是 i+1。
因此,我们需要检查 (i+1) 是否能整除 n,即 n % (i+1) == 0。
算法步骤:
- 遍历数组的每个索引
i(0 到 n-1) - 检查
(i+1)是否能整除n - 如果能整除,则
nums[i]是特殊元素,将其平方加入结果 - 返回所有特殊元素平方的总和
这种方法简单直接,时间复杂度为 O(n),空间复杂度为 O(1)。
代码实现
class Solution {
public:
int sumOfSquares(vector<int>& nums) {
int n = nums.size();
int result = 0;
for (int i = 0; i < n; i++) {
if (n % (i + 1) == 0) {
result += nums[i] * nums[i];
}
}
return result;
}
};
class Solution:
def sumOfSquares(self, nums: List[int]) -> int:
n = len(nums)
result = 0
for i in range(n):
if n % (i + 1) == 0:
result += nums[i] * nums[i]
return result
public class Solution {
public int SumOfSquares(int[] nums) {
int n = nums.Length;
int result = 0;
for (int i = 0; i < n; i++) {
if (n % (i + 1) == 0) {
result += nums[i] * nums[i];
}
}
return result;
}
}
/**
* @param {number[]} nums
* @return {number}
*/
var sumOfSquares = function(nums) {
let sum = 0;
const n = nums.length;
for (let i = 1; i <= n; i++) {
if (n % i === 0) {
sum += nums[i - 1] * nums[i - 1];
}
}
return sum;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 需要遍历整个数组一次 |
| 空间复杂度 | O(1) | 只使用了常数个额外变量 |
相关题目
. Sum of Square Numbers (Medium)