本题的难点在于存在负数,我们知道非负数的平方数排序规则一定与
原数组顺序相同,但这里存在负数,导致无法直接确定
方法一:先计算出所有数的平方,然后排序
时间O(nlogn)(排序所用时间),空间O(logn)(排序所申请栈空间与深度有关,这里忽略了返回要求数组的空间)
1 class Solution { 2 public int[] sortedSquares(int[] nums) { 3 int[] ans = new int[nums.length]; 4 for (int i = 0; i < nums.length; ++i) { 5 ans[i] = nums[i] * nums[i]; 6 } 7 Arrays.sort(ans); 8 return ans; 9 } 10 }
方法二:使用双指针,头尾2个指针比较绝对值大小,然后倒叙填充返回数组
时间O(n),空间O(1)(这里不计算申请返回结果所申请的O(n)空间)
1 public int[] sortedSquares(int[] nums) { 2 int[] res = new int[nums.length]; 3 for(int i=0,j=nums.length-1,k=nums.length-1;i<=j;){ 4 if(Math.abs(nums[i])>Math.abs(nums[j])){ 5 res[k--]=nums[i]*nums[i]; 6 i++; 7 }else{ 8 res[k--]=nums[j]*nums[j]; 9 j--; 10 } 11 } 12 return res; 13 }