题目
给你一个按 非递减顺序 排序的整数数组 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)定义两个指针,i
指向起始位置,j
指向终止位置
(2)再定义一个同样大小的新数组result
,用k
指向result
数组最后一个位置(因为位置i,j
指向的是最大值,要非递减排序,最大值就要从最后开始排起)
(3)最后开始数组两端比较,谁平方后大就放进result
数组,更新各个下标
class Solution {
public int[] sortedSquares(int[] nums) {
int right = nums.length - 1;
int left = 0;
int[] result = new int[nums.length];
int index = result.length - 1;
while (left <= right) {
if (nums[left] * nums[left] > nums[right] * nums[right]) {
// 正数的相对位置是不变的, 需要调整的是负数平方后的相对位置
result[index--] = nums[left] * nums[left];
left++;
} else {
result[index--] = nums[right] * nums[right];
right--;
}
}
return result;
}
}