classSolution: defsumOfSquares(self, nums: List[int]) -> int: returnsum(x * x for i, x inenumerate(nums, 1) iflen(nums) % i == 0)
[sol-Java]
1 2 3 4 5 6 7 8 9 10 11
classSolution { publicintsumOfSquares(int[] nums) { intans=0, n = nums.length; for (inti=1; i <= n; i++) { if (n % i == 0) { ans += nums[i - 1] * nums[i - 1]; } } return ans; } }
[sol-C++]
1 2 3 4 5 6 7 8 9 10 11 12
classSolution { public: intsumOfSquares(vector<int> &nums){ int ans = 0, n = nums.size(); for (int i = 1; i <= n; i++) { if (n % i == 0) { ans += nums[i - 1] * nums[i - 1]; } } return ans; } };
[sol-Go]
1 2 3 4 5 6 7 8
funcsumOfSquares(nums []int) (ans int) { for i, x := range nums { iflen(nums)%(i+1) == 0 { ans += x * x } } return }
[sol-JavaScript]
1 2 3 4 5 6 7 8 9 10
var sumOfSquares = function (nums) { const n = nums.length; let ans = 0; for (let i = 1; i <= n; i++) { if (n % i === 0) { ans += nums[i - 1] * nums[i - 1]; } } return ans; };
复杂度分析
时间复杂度:\mathcal{O}(n),其中 n 为 nums 的长度。
空间复杂度:\mathcal{O}(1)。仅用到若干额外变量。
算法二:枚举
根据题意,i 是 n 的因子,此时 \dfrac{n}{i 也是 n 的因子,那么只需要枚举 \sqrt{n 以内的 i,就可以得到大于 \sqrt{n 的另一个因子了。
[sol-Python3]
1 2 3 4 5 6 7 8 9
classSolution: defsumOfSquares(self, nums: List[int]) -> int: ans, n = 0, len(nums) for i inrange(1, isqrt(n) + 1): if n % i == 0: ans += nums[i - 1] ** 2# 注意数组的下标还是从 0 开始的 if i * i < n: # 避免重复统计 ans += nums[n // i - 1] ** 2 return ans
[sol-Java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution { publicintsumOfSquares(int[] nums) { intans=0, n = nums.length; for (inti=1; i * i <= n; i++) { if (n % i == 0) { ans += nums[i - 1] * nums[i - 1]; // 注意数组的下标还是从 0 开始的 if (i * i < n) { // 避免重复统计 ans += nums[n / i - 1] * nums[n / i - 1]; } } } return ans; } }
[sol-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution { public: intsumOfSquares(vector<int> &nums){ int ans = 0, n = nums.size(); for (int i = 1; i * i <= n; i++) { if (n % i == 0) { ans += nums[i - 1] * nums[i - 1]; // 注意数组的下标还是从 0 开始的 if (i * i < n) { // 避免重复统计 ans += nums[n / i - 1] * nums[n / i - 1]; } } } return ans; } };
[sol-Go]
1 2 3 4 5 6 7 8 9 10 11 12
funcsumOfSquares(nums []int) (ans int) { n := len(nums) for i := 1; i*i <= n; i++ { if n%i == 0 { ans += nums[i-1] * nums[i-1] // 注意数组的下标还是从 0 开始的 if i*i < n { // 避免重复统计 ans += nums[n/i-1] * nums[n/i-1] } } } return }
[sol-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12 13
var sumOfSquares = function (nums) { const n = nums.length; let ans = 0; for (let i = 1; i * i <= n; i++) { if (n % i === 0) { ans += nums[i - 1] * nums[i - 1]; // 注意数组的下标还是从 0 开始的 if (i * i < n) { // 避免重复统计 ans += nums[n / i - 1] * nums[n / i - 1]; } } } return ans; };