403 字
2 分钟
977. 有序数组的平方

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:直接对每个元素平方,最后排序。时间复杂度等于快速排序的复杂度。
  • 思路2:创建一个数组,将每个元素按顺序地填充到对应的位置,类似于直接插入排序。
  • 思路3:由于存在正负号,数组中的绝对值呈现两端大,中间小的情况。
    • 思路2的问题就是,以绝对值最小值为分界点,按照从前往后的顺序,前半部分从大到小,而后半部分从小到大。
    • 为了避免这种情况,可以使用2个指针从两端开始遍历比较,这样就可以避免顺序不一致的情况。
    • 另外,两端的数据大,因此要添加到结果数组中的最后面。

代码流程#

  1. 创建双指针left, right
  2. 创建一个结果数组和末尾指针res, i
  3. 从后往前添加结果到res
  4. 比较nums[left], nums[right],添加大的,并更新指针。

代码#

class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
vector<int> res(n);
int left = 0;
int right = n - 1;
for(int i = n-1; i >= 0; i--){
if(abs(nums[left]) > abs(nums[right])){
res[i] = nums[left] * nums[left];
left++;
}
else{
res[i] = nums[right] * nums[right];
right--;
}
}
return res;
}
};
977. 有序数组的平方
https://chrisnake11.github.io/blog/posts/coding/leecode/977-有序数组的平方/
作者
Zheyv
发布于
2025-07-14
许可协议
CC BY-NC-SA 4.0