题目
给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100] |
输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121] |
思路
这里其实还是用到了双指针的方法。我们可以先想一想,对于经过非递减顺序排序的整数数组,平方的最大值会出现在哪里呢?实际上,平方的最大值只会出现在整数组的两端。想要一个数的平方最大,我们只需要保证一个数的绝对值是最大的,因此绝对值最大的数只会出现在整数组的两端(通俗点讲,要么是最正的数,要么是最负的数)。这也就引出了双指针的做法。
我们可以定义两个指针leftPointer和rightPointer,分别指向数组的最左端和最右端。我们每次比较两个指针指向的数的平方的大小,并将其放在新数组空缺部分的最末尾,因为我们每次提取出来的数一定是剩余数组中的最大值。之后,我们将指向平方最大的那个数的指针往相对的方向移动一格(leftPointer向右移,rightPointer向左移),继续上面比较、填充的操作即可。
代码实现
class Solution {
public int[] sortedSquares(int[] nums) {
int leftPointer = 0;
int rightPointer = nums.length - 1;
int currentIndex = nums.length -1;
int[] result = new int[nums.length];
while (leftPointer <= rightPointer){
if(nums[leftPointer]*nums[leftPointer] > nums[rightPointer]*nums[rightPointer]){
result[currentIndex--] = nums[leftPointer] * nums[leftPointer];
leftPointer++;
}
else{
result[currentIndex--] = nums[rightPointer] * nums[rightPointer];
rightPointer--;
}
}
return result;
}
}
这里的终止条件就是leftPointer > rightPointer,说明数组中的所有数都已经遍历过一遍了。
代码中的currentIndex就是代表了新数组每次填入新数时候的位置,也就是新数组空缺位置的最末端。
希望这篇博客对你们能有帮助!