问题描述:
给你一个按 非递减顺序 排序的整数数组 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(nlogn),其中 n 是数组 nums 的长度。
受之前做过的题的启发,这里采用双指针的方法:
由于平方最大的数一定在数组的两边,因此两个指针分别指向最左端和最右端,将平方大的值放在新数组的最后。若左指针对应的值平方后更大,将其放到新数组后,移动左指针,再和右指针对应的值相比,直至左指针大于右指针,循环结束。
class Solution {
public int[] sortedSquares(int[] nums) {
int[] result = new int[nums.length];
int i = nums.length - 1;
int p = 0;
int q = nums.length - 1;
while(p <= q){
if((nums[p] * nums[p]) < (nums[q] * nums[q])){
result[i] = nums[q] * nums[q];
q--;
}
else{
result[i] = nums[p] * nums[p];
p++;
}
i--;
}
return result;
}
}
双指针方法的时间复杂度为O(n)。