给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
已按 非递减顺序 排序
进阶:
- 请你设计时间复杂度为
O(n)
的算法解决本问题
way1:
最直观的想法是:
每个数平方后快速排序,时间复杂度为(n+nlogn).
way2:
双指针法:
数组本来是有序的,
平方后的最大值,次大值...只有可能在所给数组的两端.可以用双指针,l指向数组左边平方后的值,r指向数组右边平方后的值,比较l,r大小,大的那个存入新数组,并且对应指针向右(向左移一位)
考虑到最先存入的数是最大的,因此新数组从最右边开始存,新数组的指针result从右边开始.
public static int[] sortedSquares(int[] nums) {
int[] newnums=new int[nums.length];
int result= newnums.length-1;
int l=0,r=nums.length-1;
for (int i = 0; i < newnums.length; i++) {
int left=nums[l]*nums[l];
int right=nums[r]*nums[r];
if(left>right){
newnums[result--]=left;
l++;
}else
{newnums[result--]=right;
r--;
}
}
return newnums;
}