原题地址(中等)

方法1—sort

思路

直接用sort函数就好了

代码

  1. class Solution {
  2. public:
  3. vector<int> sortedSquares(vector<int>& A) {
  4. for(int i = 0; i < A.size(); i++)
  5. A[i] *= A[i];
  6. sort(A.begin(), A.end());
  7. return A;
  8. }
  9. };

时空复杂度

时间复杂度O(logN) 空间复杂度O(1)

方法2—双指针

思路

方法一中没有利用原数组有序这个条件

可以分为三种情况:

  • 原数组全负,逆序排列就好了
  • 原数组全正,按原顺序排列就好了
  • 原数组先正后负,找出前半段负数和后半段正数,这两部分都有序,对着两部分用双指针合并成一个数组就好了。

代码

  1. class Solution {
  2. public:
  3. vector<int> sortedSquares(vector<int>& A) {
  4. int n = A.size();
  5. if(n == 0) return {};
  6. vector<int> ans;
  7. if(A[0] >= 0){
  8. for(auto a : A)
  9. ans.push_back(a * a);
  10. }
  11. else if(A[n-1] <= 0) {
  12. for(int i = n-1; i >= 0; i--)
  13. ans.push_back(A[i] * A[i]);
  14. }
  15. else{
  16. int reg = 0;
  17. for(int i = 0; i < n; i++){
  18. if(A[i] >= 0){
  19. reg = i-1;
  20. break;
  21. }
  22. }
  23. int p = reg, q = reg+1;
  24. while(p >= 0 && q < n) {
  25. if(A[p]*A[p] <= A[q] * A[q]){
  26. ans.push_back(A[p]*A[p]);
  27. p--;
  28. }
  29. else{
  30. ans.push_back(A[q]*A[q]);
  31. q++;
  32. }
  33. }
  34. while(p >= 0){
  35. ans.push_back(A[p]*A[p]);
  36. p--;
  37. }
  38. while(q < n) {
  39. ans.push_back(A[q]*A[q]);
  40. q++;
  41. }
  42. }
  43. return ans;
  44. }
  45. };

时空复杂度

时间复杂度O(N)
空间复杂度O(1)