原题:https://leetcode-cn.com/problems/squares-of-a-sorted-array/
给你一个按 非递减顺序 排序的整数数组 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 <= 10^4
- -10^4 <= nums[i] <= 10^4
- nums 已按 非递减顺序 排序
思路:
找到最后一个负数的位置,然后定义两个指针left、right,分别指向该位置和下一个位置,然后就是归并排序的合并过程了,将[0, left] 和 [right, len)这两个范围合并到返回数组中。
代码:
class Solution {
public int[] sortedSquares(int[] nums) {
int len = nums.length;
int left = 0;
for (int i = 0; i < len; i++) {
if(nums[i] < 0) {
left = i;
} else {
break;
}
}
int[] res = new int[len];
int right = left + 1;
int idx = 0;
while (left >= 0 && right < len) {
if (nums[left] + nums[right] > 0) {
res[idx++] = nums[left] * nums[left];
left--;
} else {
res[idx++] = nums[right] * nums[right];
right++;
}
}
if (left < 0) {
while (right < len) {
res[idx++] = nums[right] * nums[right];
right++;
}
}
if (right == len) {
while(left >= 0) {
res[idx++] = nums[left] * nums[left];
left--;
}
}
return res;
}
}