977. 有序数组的平方
给定一个按非递减顺序排序的整数数组
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
已按非递减顺序排序。
解法一(暴力搜索,低效,超时错误)
//时间复杂度O(nlogn), 空间复杂度O(1)
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
vector<int> res(A.size());
int n = A.size();
for(int i = 0; i < n; i++) {
res[i] = A[i] * A[i];
}
sort(res.begin(), res.end());
return res;
}
};
解法二
//时间复杂度O(n), 空间复杂度O(1)
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int i = 0, n = A.size();
while(i < n && A[i] < 0) i++;
int j = i - 1, k = 0;
vector<int> res(n);
while(j >= 0 && i < n) {
if(A[i] + A[j] <= 0) {
res[k++] = A[i] * A[i];
i++;
}
else {
res[k++] = A[j] * A[j];
j--;
}
}
while(i < n) {
res[k++] = A[i] * A[i];
i++;
}
while(j >= 0) {
res[k++] = A[j] * A[j];
j--;
}
return res;
}
};
总结:
解法一直接求平方再排序,简单暴力,就是效率低一些;
解法二用了两个指针,指向非负数和负数并向两边移动,直到遇到边界后稍加处理,可以以线性时间完成求解。
2019/08/22 0:10