Welcome to Subscribe On Youtube
3727. Maximum Alternating Sum of Squares
Description
You are given an integer array nums. You may rearrange the elements in any order.
The alternating score of an array arr is defined as:
score = arr[0]2 - arr[1]2 + arr[2]2 - arr[3]2 + ...
Return an integer denoting the maximum possible alternating score of nums after rearranging its elements.
Example 1:
Input: nums = [1,2,3]
Output: 12
Explanation:
A possible rearrangement for nums is [2,1,3], which gives the maximum alternating score among all possible rearrangements.
The alternating score is calculated as:
score = 22 - 12 + 32 = 4 - 1 + 9 = 12
Example 2:
Input: nums = [1,-1,2,-2,3,-3]
Output: 16
Explanation:
A possible rearrangement for nums is [-3,-1,-2,1,3,2], which gives the maximum alternating score among all possible rearrangements.
The alternating score is calculated as:
score = (-3)2 - (-1)2 + (-2)2 - (1)2 + (3)2 - (2)2 = 9 - 1 + 4 - 1 + 9 - 4 = 16
Constraints:
1 <= nums.length <= 105-4 * 104 <= nums[i] <= 4 * 104
Solutions
Solution 1: Sorting
We can sort the elements of the array by their squared values, then place the elements with larger squared values at even indices and those with smaller squared values at odd indices.
The final alternating score is the sum of the squared values of the larger elements minus the sum of the squared values of the smaller elements, that is, the sum of the squares of the latter half of the sorted array $\text{nums}$ minus the sum of the squares of the first half.
The time complexity is $O(n \log n)$ and the space complexity is $O(\log n)$, where $n$ is the length of the array.
-
class Solution { public long maxAlternatingSum(int[] nums) { int n = nums.length; for (int i = 0; i < n; ++i) { nums[i] *= nums[i]; } Arrays.sort(nums); long ans = 0; int m = n / 2; for (int i = 0; i < m; ++i) { ans -= nums[i]; } for (int i = m; i < n; ++i) { ans += nums[i]; } return ans; } } -
class Solution { public: long long maxAlternatingSum(vector<int>& nums) { for (int& x : nums) { x = x * x; } ranges::sort(nums); long long ans = 0, m = nums.size() / 2; for (int i = 0; i < m; ++i) { ans -= nums[i]; } for (int i = m; i < nums.size(); ++i) { ans += nums[i]; } return ans; } }; -
class Solution: def maxAlternatingSum(self, nums: List[int]) -> int: nums.sort(key=lambda x: x * x) n = len(nums) s1 = sum(x * x for x in nums[: n // 2]) s2 = sum(x * x for x in nums[n // 2 :]) return s2 - s1 -
func maxAlternatingSum(nums []int) (ans int64) { for i, x := range nums { nums[i] *= x } slices.Sort(nums) m := len(nums) / 2 for _, x := range nums[:m] { ans -= int64(x) } for _, x := range nums[m:] { ans += int64(x) } return } -
function maxAlternatingSum(nums: number[]): number { const n = nums.length; for (let i = 0; i < n; i++) { nums[i] = nums[i] ** 2; } nums.sort((a, b) => a - b); const m = Math.floor(n / 2); let ans = 0; for (let i = 0; i < m; i++) { ans -= nums[i]; } for (let i = m; i < n; i++) { ans += nums[i]; } return ans; }