题目
解题思路
本题最容易想到的思路就是:先将数组中的所有的元素进行平方,然后将计算后的数组进行一次排序。但此时的时间复杂度为O(nlogn),题目建议最好控制时间复杂度控制在O(n)内,这就意味着要在一次遍历中的将数组构造出来。
所以可以考虑使用双指针的思路:
- 创建一个新的数组,长度与原始数组长度相同,用来接收遍历到并进行计算后的数字。
- 创建两个指针,一个指针指向原始数组的第一个元素,另一个指针指向原始数组的最后一个元素。
- 为新的数组创建一个指针,指向数组的最后一个位置。
- 两个指针指向的元素平方后进行比较,大的放在新数组指针指向的位置(因为题目原本就是有序的,所以无论正负,平方后最大值一定在数组的两端),新数组指针向前移动,两端指针对向移动。
- 以left<=right为结束条件。
代码
class Solution {
public int[] sortedSquares(int[] nums) {
//创建一个新的数组,使用双指针,进行比较
int[] a = new int[nums.length];
int i = 0;
int j = nums.length -1 ;
int a_j = nums.length - 1;
while (i <= j){
if(nums[i] * nums[i] >= nums[j] * nums[j]){
a[a_j--] = nums[i] * nums[i];
i++;
}
else {
a[a_j--] = nums[j] * nums[j];
j--;
}
}
return a;
}
}