题目的要求其实就是把数组中所有元素都平方之后,再进行升序排序,但是如果使用这种简单的方法暴力解题,时间复杂度为O(n*nlogn),很难通过,因此我们还需要找出一个更加快速的解决方法。
这个题目的题眼是数组平方之后,原来位置越靠两边的元素的平方越大,越靠中间的元素的平方越小,所以我们先定义一个新的数组,用来存储我们平方排序之后的顺序,用一个参数k标志当前填入的元素个数。同时用两个参数从原数组的左右两边开始遍历,把平方后值比较大的元素先填入结果数组,代码如下:
class Solution {
public int[] sortedSquares(int[] nums) {
int right=nums.length-1;
int k=nums.length-1;
int left=0;
int[] result=new int [k+1];
while(right>=left)
{
if(nums[right]*nums[right]>=nums[left]*nums[left])
{
result[k--]=nums[right]*nums[right];
right--;
}
else if(nums[left]*nums[left]>nums[right]*nums[right])
{
result[k--]=nums[left]*nums[left];
left++;
}
}
return result;
}
}