示例 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;
}
}