题目:
算法:
- 我们用双指针算法解题
- 写题过程:一开始我找的标准是第一个大于等于0的数,用mid_z表示从零增加的指针,用mid_f表示从零减少的指针。再来一次循环,在循环里分别对两个指针对应的值比较,并选择较小的插入ans容器。可是最后提交的时候超时了。仔细想想,这里有两个for循环,而且里面还有好多比较,这样子效率还不如先输入平方再排序的效率高。最后发现我的标准选错了,我应该从两头往中间走,这样子节约了很多次比较。
- 算法主体:定义两个指针,分别指向头尾,并在循环里比较大小,并插入ans容器中即可。
- 时间复杂度:O(n),每一个数据都会被遍历一遍
- 空间复杂度:O(n),维护一个ans容器
源代码:
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int n = A.size();
vector<int> ans(n);
int z = INT_MAX;
int f = INT_MAX;
int mid_f = 0;
int mid_z = n - 1;
int i = n - 1;
while(mid_f < mid_z + 1){
z = INT_MAX;
f = INT_MAX;
z = A[mid_z] * A[mid_z];
f = A[mid_f] * A[mid_f];
if(z < f){
ans[i] = f;
i--;
mid_f++;
}
else{
ans[i] = z;
i--;
mid_z --;
}
}
return ans;
}
};