LeetCode 3727.最大交替平方和:排序 (双指针可选)

【LetMeFly】3727.最大交替平方和:排序 (双指针可选)

力扣题目链接:https://leetcode.cn/problems/maximum-alternating-sum-of-squares/

给你一个整数数组 nums。你可以以任意顺序 重新排列元素。

数组 arr 的 交替得分定义为:

  • score = arr[0]2 - arr[1]2 + arr[2]2 - arr[3]2 + ...

在对 nums 重新排列后,返回其 最大可能的交替得分。

示例 1:
输入: nums = 1,2,3

输出: 12

解释:

nums 的一种可行重排为 [2,1,3],该排列在所有可能重排中给出了最大交替得分。

交替得分计算如下:

score = 22 - 12 + 32 = 4 - 1 + 9 = 12

示例 2:
输入: nums = 1,-1,2,-2,3,-3

输出: 16

解释:

nums 的一种可行重排为 [-3,-1,-2,1,3,2],该排列在所有可能重排中给出了最大交替得分。

交替得分计算如下:

score = (-3)2 - (-1)2 + (-2)2 - (1)2 + (3)2 - (2)2 = 9 - 1 + 4 - 1 + 9 - 4 = 16

提示:

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

解题方法:排序

对数组以元素绝对值为依据排序,假设数组长度为 n n n,加上 ⌈ n 2 ⌉ \lceil\frac{n}{2}\rceil ⌈2n⌉个最大元素的平方、减去 ⌊ n 2 ⌋ \lfloor\frac{n}{2}\rfloor ⌊2n⌋个最小元素的平方即为答案。

  • 时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),时间复杂度主要来自排序
  • 空间复杂度 O ( n ) O(n) O(n),如果原地修改参数数组可以将空间复杂度降低到 O ( log ⁡ n ) O(\log n) O(logn)

AC代码

C++ ------ 直接加前 ⌈ n 2 ⌉ \lceil\frac{n}{2}\rceil ⌈2n⌉个 然后减后 ⌊ n 2 ⌋ \lfloor\frac{n}{2}\rfloor ⌊2n⌋ 个
cpp 复制代码
/*
 * @LastEditTime: 2026-10-13 22:18:09
 */
typedef long long ll;
class Solution {
public:
    ll maxAlternatingSum(vector<int>& nums) {
        for (int& t : nums) {
            t = abs(t);
        }
        ranges::sort(nums, greater<int>());

        ll ans = 0;
        int half = (nums.size() + 1) / 2;
        for (int i = 0; i < half; i++) {
            ans = ans + nums[i] * nums[i];
        }
        for (int i = half; i < nums.size(); i++) {
            ans = ans - nums[i] * nums[i];
        }
        return ans;
    }
};
C++ ------ 双指针,从两边开始一加一减
cpp 复制代码
/*
 * @LastEditTime: 2026-10-13 22:15:35
 */
typedef long long ll;
class Solution {
public:
    ll maxAlternatingSum(vector<int>& nums) {
        for (int& t : nums) {
            t = abs(t);
        }
        ranges::sort(nums);

        ll ans = 0;
        for (int l = 0, r = nums.size() - 1; l <= r; l++, r--) {
            ans += (ll) (nums[r] * nums[r]);
            if (l == r) {
                break;
            }
            ans -= (ll) (nums[l] * nums[l]);
        }
        return ans;
    }
};

End

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

千篇源码题解已开源

相关推荐
鶴哥只手遮天1 小时前
《OpenFOAM 源码深度剖析》系列-第 9 章 有限体积离散框架:`fvMatrix`、`fvSchemes` 与 `fvSolution`
算法·开源
鶴哥只手遮天1 小时前
《OpenFOAM 源码深度剖析》系列-第 7 章 网格与拓扑体系:`polyMesh`、`primitiveMesh` 与 patch
算法·开源
CHEEVEN_QY1 小时前
热仿真在液冷板设计中的应用价值与局限性客观评估
人工智能·算法
无忧.芙桃1 小时前
图的精髓:邻接矩阵与遍历全解析
c++·算法·面试·深度优先·广度优先
Nil2081 小时前
leetcode 1143最长公共子序列
算法·leetcode·职场和发展
脚踏实地,坚持不懈!1 小时前
Linux 内存回收机制:水位线、kswapd 与 Direct Reclaim
linux·jvm·算法
Logic1011 小时前
C语言/数据结构动态规划题解:字符串变回文的最少操作次数——最长回文子序列(LPS)
c语言·数据结构·算法·动态规划·时间复杂度·回文串·最长回文子序列
圣保罗的大教堂2 小时前
leetcode 2778. 特殊元素平方和 简单
leetcode
UIU1142 小时前
P1115 最大子段和
c++·算法