题目:
给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例 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 已按非递减顺序排序。
Java代码:
class Solution {
public int[] sortedSquares(int[] A
) {
int len
=A
.length
;
int j
=0;
while(j
<len
&&A
[j
]<0)
{
j
++;
}
int i
=j
-1;
int t
=0;
int[] ans
=new int[len
];
while (j
<len
&&i
>=0){
if(A
[j
]*A
[j
]<A
[i
]*A
[i
]){
ans
[t
++]=A
[j
]*A
[j
];
j
++;
}else{
ans
[t
++]=A
[i
]*A
[i
];
i
--;
}
}
while(i
>=0){
ans
[t
++]=A
[i
]*A
[i
];
i
--;
}
while(j
<len
){
ans
[t
++]=A
[j
]*A
[j
];
j
++;
}
return ans
;
}
}
思路:
双指针法,因为数组已经排好序,找到最小的负数和非负数,这两个数应该是相邻的,我们可以使用两个指针分别读取数组的非负部分与负数部分 —— 指针 i 反向读取负数部分,指针 j 正向读取非负数部分。
复杂度分析:
时间复杂度:
O
(
N
)
O(N)
O(N),其中 NN 是数组 A 的长度。 空间复杂度:
O
(
N
)
O(N)
O(N)。