给你一个按 非递减顺序 排序的整数数组 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]
用双端指针收缩遍历,每次判断,再创建一个新数组和新指针按顺序填入即可。
class Solution {
public int[] sortedSquares(int[] nums) {
//定义端指针
int left = 0;
int right = nums.length - 1;
//定义存放结果的盒子与索引
int[] result = new int[nums.length];
int index = nums.length - 1;
//收缩,分流填入result,时间复杂度0(n)
//需要注意<=,第一次没注意收缩是否能重合,导致单个元素的数组测试用例通过不了
while (left <= right) {
if (nums[left] * nums[left] > nums[right] * nums[right]) {
result[index] = nums[left] * nums[left];
index--;
left++;
}
if (nums[left] * nums[left] < nums[right] * nums[right]) {
result[index] = nums[right] * nums[right];
index--;
right--;
}
if (nums[left] * nums[left] == nums[right] * nums[right]) {
result[index] = nums[right] * nums[right];
index--;
right--;
}
}
//结束返回结果:result
return result;
}
}