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] <= 10000Ais 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)
数组平方排序的两种解法

博客针对给定非递减顺序整数数组,求其每个数平方后仍按非递减顺序排列的数组。介绍两种解法,一是用Array.sort() method,时间复杂度O(N log N);二是双指针法,反向遍历负数部分、正向遍历正数部分,时间复杂度O(N),两种空间复杂度均为O(N)。
855

被折叠的 条评论
为什么被折叠?



