Given an array of integers A
sorted in non-decreasing order, return an array of the squares of each number, also in sorted non-decreasing order.
Example 1:
Input: [-4,-1,0,3,10] Output: [0,1,9,16,100]
Example 2:
Input: [-7,-3,2,3,11] Output: [4,9,9,49,121]
Note:
1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A
is sorted in non-decreasing order.
Approach #1 我的解法 Array.sort() method
class Solution {
public int[] sortedSquares(int[] A) {
for(int i=0;i<A.length;i++){
A[i]*=A[i];
}
Arrays.sort(A);
return A;
}
}
用Array.sort() method.
Complexity Analysis
-
Time Complexity: O(N log N), where N is the length of
A
. -
Space Complexity: O(N).
Approach #2 Two Pointer
class Solution {
public int[] sortedSquares(int[] A) {
int N = A.length;
int j = 0;
while (j < N && A[j] < 0)
j++;
int i = j-1; //最后一个负数的下标
int[] ans = new int[N];
int t = 0;
while (i >= 0 && j < N) { //从正负数的分界开始,坐标向两边移动
if (A[i] * A[i] < A[j] * A[j]) {
ans[t++] = A[i] * A[i];
i--;
} else {
ans[t++] = A[j] * A[j];
j++;
}
}
// 最后加入剩下的
while (i >= 0) {
ans[t++] = A[i] * A[i];
i--;
}
while (j < N) {
ans[t++] = A[j] * A[j];
j++;
}
return ans;
}
}
This strategy is to iterate over the negative part in reverse, and the positive part in the forward direction.
We can use two pointers to read the positive and negative parts of the array - one pointer j
in the positive direction, and another i
in the negative direction.
Now that we are reading two increasing arrays (the squares of the elements), we can merge these arrays together using a two-pointer technique.
Complexity Analysis
-
Time Complexity: O(N), where N is the length of
A
. -
Space Complexity: O(N)