目录结构
1.题目
给定一个按非递减顺序排序的整数数组 A
,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例:
输入:[-4,-1,0,3,10]
输出:[0,1,9,16,100]
输入:[-7,-3,2,3,11]
输出:[4,9,9,49,121]
提示:
1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A
已按非递减顺序排序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.题解
2.1排序
将数组每个元素平方,然后排序这个数组。
public class Solution977 {
public int[] sortedSquares(int[] A) {
for (int i = 0; i < A.length; i++) {
A[i] *= A[i];
}
Arrays.sort(A);
return A;
}
}
- 时间复杂度:
- 空间复杂度:
2.2双指针
由于原数组已排好序,故可以用两个指针分别读取数组的非负部分与负数部分
- 指针 i 反向读取负数部分;
- 指针 j 正向读取非负数部分。
使用两个指针分别读取两个递增的数组(按元素的平方排序)然后合并。
public class Solution977 {
public int[] sortedSquares(int[] A) {
int len = A.length, j = 0, p = 0;
int[] result = new int[len];
while (j < len && A[j] < 0) {
j++;
}
int i = j - 1;
while (i >= 0 && j < len) {
if (A[i] * A[i] < A[j] * A[j]) {
result[p++] = A[i] * A[i];
i--;
} else {
result[p++] = A[j] * A[j];
j++;
}
}
while (i >= 0) {
result[p++] = A[i] * A[i];
i--;
}
while (j < len) {
result[p++] = A[j] * A[j];
j++;
}
return result;
}
}
- 时间复杂度:
- 空间复杂度: