LeetCode 977. 有序数组的平方 双指针

154 阅读1分钟

题目描述

题目来源:力扣(LeetCode)
题目链接:977. 有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:

输入: nums = [-7,-3,2,3,11]
输出: [4,9,9,49,121]

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 已按 非递减顺序 排序

解题方法:双指针

思路

对于一个非递减列表,元素平方最大值只可能出现在最左侧、最右侧。
讨论左右侧元素符号,可得知:左侧元素平方大于右侧元素平方等价于左侧元素的相反数大于右侧元素。

代码

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        // 数组长度
        int n = nums.size();
        // 结果列表
        vector<int> ans(n);
        // index 为 ans 下一个插入位置,nums 的区间 [left, right] 内的元素为待处理元素
        for(int index = n - 1, left = 0, right = n - 1; index >= 0; --index) {
            if(-nums[left] > nums[right]) { // nums[left] 的平方大于 nums[right] 的平方
                ans[index] = nums[left] * nums[left]; // 放入 nums[left] 的平方
                ++left; // 缩小待处理元素的区间
            }else { // nums[left] 的平方小于 nums[right] 的平方
                
                ans[index] = nums[right] * nums[right]; // 放入 nums[right] 的平方
                --right; // 缩小待处理元素的区间
            }
        }
        // 返回结果列表
        return ans;
    }
};