题目内容:
给定一个按非递减顺序排序的整数数组 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 已按非递减顺序排序。
解题思路:
题目非常简单,暴力的方法就是直接对数组求平方,然后重新排序即可。
class Solution {
public int[] sortedSquares(int[] A) {
for(int i=0;i<A.length;i++)
A[i] *= A[i];
Arrays.sort(A);
return A;
}
}
时间复杂度为O(nlog2n)。
时间复杂度可以优化到O(n),优化思路:
如果数组全是正数的话,那么平方后的数组依然有序。
所以破坏数组有序的重点是负数。
而且正确的比较顺序是从0的两边进行对比。因此令下标j指向非负数的下标,而i指向最大负数的下标,然后向两边进行比较。
class Solution {
//index: 0 1 2 3 4
//value: -4 -1 0 3 10
// i j
public int[] sortedSquares(int[] A) {
int[] res = new int[A.length];
if(A.length == 0)
return res;
int j = 0;
int i = 0;
while(j<A.length && A[j]<0) //j为0的下标
j++;
i = j - 1;//i为最大的负数的下标
int t = 0;
while(j<A.length && i>=0){
if(A[j]*A[j] <= A[i]*A[i]){
res[t++] = A[j]*A[j];
j++;
}else{
res[t++] = A[i]*A[i];
i--;
}
}
while(j<A.length){
res[t++] = A[j]*A[j];
j++;
}
while(i>=0){
res[t++] = A[i]*A[i];
i--;
}
return res;
}
}
时间复杂度为O(n),但空间复杂度为O(n)。