题目

给你一个按 非递减顺序 排序的整数数组 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 已按 非递减顺序 排序

解答

  1. 常规思路

先对每个数组的元素进行平方赋值,然后对数组进行排序。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for (int i = 0; i < nums.size(); i++) {
            nums[i] = nums[i] * nums[i];
        }
        sort(nums.begin(), nums.end()); //排序
        return nums;
    }
};
  1. 利用指向正负分界线的指针构造“归并排序”

常规思路未使用题目的“非递减顺序数组”的条件,因此我们新建一个指针,它指向数组中的最后一个非正数元素,然后从中间向两边进行遍历,将平方和较小的结果插入rst数组中。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> rst;
        int n = nums.size();
        //1. 获取数组正负边界索引
        int index = -1;
        for(int i = 0; i < n; i++) {
            if (nums[i] < 0) {
                index = i;
            }
            else {
                break;
            }
        }
        //2. 双指针从中间向两边遍历
        int i = index;
        int j = index + 1;
        while(i >= 0 || j < n) {
            if (i < 0) {
                rst.push_back(nums[j] * nums[j]);
                j++;
            }
            else if (j == n) {
                rst.push_back(nums[i] * nums[i]);
                i--;
            }
            else if (nums[i] * nums[i] < nums[j] * nums[j]) {
                rst.push_back(nums[i] * nums[i]);
                i--;
            }
            else {
                rst.push_back(nums[j] * nums[j]);
                j++;
            }
        }
        return rst;
    }
};