给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例 1:
输入:[-4,-1,0,3,10]
输出:[0,1,9,16,100]
示例 2:
输入:[-7,-3,2,3,11]
输出:[4,9,9,49,121]
提示:
1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A 已按非递减顺序排序。
方法:
暴力解法是算出来平方之后,进行排序,但是排序最优时间复杂度也是O(NlogN)
双指针
利用好A的非递减
的特点;从右向左
更新,判断两个指针所在的元素平方之后谁更大,可以根据绝对值谁大,也可以直接用(A[left] + A[right]) 和0的大小关系来判断
时间复杂度:O(n),其中 n 是数组 A 的长度。
空间复杂度:O(1),结果数组是必须开辟的空间。
class Solution {
public int[] sortedSquares(int[] A) {
if(A == null || A.length == 0){
return A;
}
int n = A.length;
//结果数组,必须开辟的空间,不算额外空间
int[] result = new int[n];
//倒序从右向左(从大到小)放
for(int left = 0, right = n - 1, cur = n - 1; cur >= 0; --cur){
//abs(A[right])>=abs(A[left]):
if((A[left] + A[right]) >= 0){
result[cur] = A[right] * A[right];
--right;
}
//abs(A[right])<abs(A[left]):
else{
result[cur] = A[left] * A[left];
++left;
}
}
return result;
}
}