给定一个按非递减顺序排序的整数数组 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),其中 N 是数组 A
的长度。换一种思路,用双指针方法,从数组的两端开始判断,题目给出的数组是有序递增的,所以判断A[0]平方和A[j](j是A.length-1)平方的大小,即可得到最大的元素,并存入新数组的最大元素位置,如此比较,直至头尾指针相遇,完成数组元素平方的排序。双指针方法的时间复杂度为:O(N),其中 N 是数组 A
的长度。
解法一(暴力解法)
class Solution {
public int[] sortedSquares(int[] A) {
int[] B = new int[A.length];
for(int i = 0;i < A.length;i++){
B[i] = A[i] * A[i];
}
Arrays.sort(B);
return B;
}
}
解法二(双指针,推荐)
class Solution {
public int[] sortedSquares(int[] A) {
int A_len = A.length;
int i = 0;
int j = A.length -1;
int k = A.length -1;
int[] B = new int[A_len];
if(A_len == 0)
return new int[] {0};
while(i <= j){
if(A[i]*A[i] <= A[j]*A[j]){
B[k] = A[j]*A[j];
j--;
k--;
}
else{
B[k] = A[i]*A[i];
i++;
k--;
}
}
return B;
}
}