题目描述
解题
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length - 1;
int[] result = new int[nums.length];
int k = nums.length - 1;
while(left <= right){
if(nums[left] * nums[left] < nums[right] * nums[right]){
result[k--] = nums[right] * nums[right];
right--;
}else{
result[k--] = nums[left] * nums[left];
left++;
}
}
return result;
}
}
思路
首先明确一下题目要求,给的数组是一个非递减顺序排序,那么就是说明会有负数,当有负数之后就会有两种情况:
可能负数的平方会比正数的平方大,那么这个最大值就是在负数这边且是负数的最小值。
还有一种情况就是正数的平方比负数大,那么最大值就是在正数里面的最大值。
这时我们就可以发现,最大值要不就是在有负数的最左边或者正数的最右边。
那么我们就只需要将两边的数据进行比较然后较大的就是最大值然后倒序填入到新数组中。
整个大小趋势就如图所示:
所以这时我们就可以选择使用双指针,然后分别从左右两边遍历,选择出里面较大的一个来填入到一个新数组中,这个新数组要倒叙插入,因为从两边遍历是从最大值开始遍历。而新数组的要求也是非递减的,那么只能倒叙插入保证从大到小非递减的顺序。
注意
这里面代码也有一个临界值的问题:就是这个 while 循环的条件。
这个也可以采取一个举例的方式来进行检查,例如如果是left < right
那么当最后还剩 [3, 4] 的时候,又进行了一次比较,这时 4 被加入到了新数组中。然后还剩一个 3 这时left = right
了不符合条件就直接跳出来,这样就少处理了一个元素。所以应该是left <= rigth
。