示例 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] * A[i];
}
Arrays.sort(A);
return A;
}
}
第二个思路的(看的大佬的解法),先找到绝对值最小的值,然后左右两个指针碰到绝对值较小的就先插入到数组里,指针加加。最后将另外一个指针移到最后即可,注意一下边界值即可。
class Solution {
public int[] sortedSquares(int[] A) {
int indexA,indexB;
int midIndex = 0;
for(int i = 0;i < A.length;i++){
if(Math.abs(A[midIndex]) > Math.abs(A[i])){
midIndex = i;
}
}
indexA = midIndex - 1;
indexB = midIndex + 1;
int[] result = new int[A.length];
int i = 0;
result[i++] = A[midIndex] * A[midIndex];
while(indexA >= 0 && indexB <= A.length - 1){
if(Math.abs(A[indexA]) >= Math.abs(A[indexB])){
result[i++] = A[indexB] * A[indexB++];
}else{
result[i++] = A[indexA] * A[indexA--];
}
}
while(indexA >= 0){
result[i++] = A[indexA] * A[indexA--];
}
while(indexB < A.length){
result[i++] = A[indexB] * A[indexB++];
}
return result;
}
}