拿一道题举例
给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
输入:-4 -1 0 3 10
输出:0 1 9 16 100
普通做法
//先遍历逐个平方,然后调用sort方法
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
for(int i = 0; i < A.size(); i++)
{
A[i] = A[i]*A[i];
}
sort(A.begin(), A.end());
return A;
}
};
双指针做法
思路:给定的非递减数组有三种形式
- 全为正数,平方后仍为非递减序列
- 全为负数,平方后为非递增数列,仍有序
- 有正数有负数,平方后较大的值总是位于两侧,所以可以用两个指针,比较头尾的大小,指向的数哪个较大就插入新的数组,减少时间复杂度
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int len = A.size();
vector<int> ans(len);//目标数组
int i = 0, j = len - 1, k = j;//i从头开始, j从尾开始
while(k >= 0)
{
if(A[i]*A[i] < A[j]*A[j]) //如果头小于尾
{
ans[k] = A[j]*A[j] ;//目标数组中插入尾
j--;
}
else{
ans[k] = A[i]*A[i];//否则插入头
i++;
}
k--;
}
return ans;
}
};