原题地址(中等)
方法1—sort
思路
直接用sort函数就好了
代码
class Solution {public:vector<int> sortedSquares(vector<int>& A) {for(int i = 0; i < A.size(); i++)A[i] *= A[i];sort(A.begin(), A.end());return A;}};
时空复杂度
时间复杂度O(logN) 空间复杂度O(1)
方法2—双指针
思路
方法一中没有利用原数组有序这个条件
可以分为三种情况:
- 原数组全负,逆序排列就好了
- 原数组全正,按原顺序排列就好了
- 原数组先正后负,找出前半段负数和后半段正数,这两部分都有序,对着两部分用双指针合并成一个数组就好了。
代码
class Solution {public:vector<int> sortedSquares(vector<int>& A) {int n = A.size();if(n == 0) return {};vector<int> ans;if(A[0] >= 0){for(auto a : A)ans.push_back(a * a);}else if(A[n-1] <= 0) {for(int i = n-1; i >= 0; i--)ans.push_back(A[i] * A[i]);}else{int reg = 0;for(int i = 0; i < n; i++){if(A[i] >= 0){reg = i-1;break;}}int p = reg, q = reg+1;while(p >= 0 && q < n) {if(A[p]*A[p] <= A[q] * A[q]){ans.push_back(A[p]*A[p]);p--;}else{ans.push_back(A[q]*A[q]);q++;}}while(p >= 0){ans.push_back(A[p]*A[p]);p--;}while(q < n) {ans.push_back(A[q]*A[q]);q++;}}return ans;}};
时空复杂度
时间复杂度O(N)
空间复杂度O(1)
