https://leetcode.com/problems/squares-of-a-sorted-array/

1. Use swapsort:

  1. //TLE
  2. class Solution {
  3. public:
  4. vector<int> sortedSquares(vector<int>& A) {
  5. if(A.empty()) return A;
  6. for(int i = 0; i < A.size() - 1; i++){
  7. for(int j = i + 1; j < A.size(); j++){
  8. if(abs(A[i]) > abs(A[j]))
  9. swap(A[i], A[j]);
  10. }
  11. }
  12. for(int i = 0; i < A.size(); i++)
  13. A[i] = A[i] * A[i];
  14. return A;
  15. }
  16. };

2. Use STL template:

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

3. Use two pointers:

  1. //56 ms 26.8 MB
  2. class Solution {
  3. public:
  4. vector<int> sortedSquares(vector<int>& A) {
  5. if(A.empty()) return A;
  6. int n = A.size();
  7. int r = 0;
  8. while(r < n && A[r] < 0)
  9. r++;
  10. int l = r - 1;
  11. vector<int> result;
  12. while(l>=0 && r<=n-1) {
  13. if(abs(A[l]) < abs(A[r])){
  14. result.push_back(A[l]*A[l]);
  15. l--;
  16. } else {
  17. result.push_back(A[r]*A[r]);
  18. r++;
  19. }
  20. }
  21. while(l>=0){
  22. result.push_back(A[l]*A[l]);
  23. l--;
  24. }
  25. while(r<=n-1){
  26. result.push_back(A[r]*A[r]);
  27. r++;
  28. }
  29. return result;
  30. }
  31. };

4. Use MergeSort:

  1. //return vectors
  2. //512 ms 86.1 MB
  3. class Solution {
  4. public:
  5. vector<int> sortedSquares(vector<int>& A) {
  6. if(A.empty()) return A;
  7. int n = A.size();
  8. for(int i = 0; i < n; i++)
  9. A[i] = A[i] * A[i];
  10. vector<int> result = MergeSort(A, 0, A.size()-1);
  11. return result;
  12. }
  13. private:
  14. vector<int> Merge(vector<int>& L, vector<int>& R){
  15. vector<int> sumup;
  16. int l_index = 0;
  17. int r_index = 0;
  18. while(l_index < L.size() && r_index < R.size()) {
  19. if(L[l_index] <= R[r_index]) {
  20. sumup.push_back(L[l_index]);
  21. l_index++;
  22. } else {
  23. sumup.push_back(R[r_index]);
  24. r_index++;
  25. }
  26. }
  27. while(l_index < L.size()){
  28. sumup.push_back(L[l_index]);
  29. l_index++;
  30. }
  31. while(r_index < R.size()){
  32. sumup.push_back(R[r_index]);
  33. r_index++;
  34. }
  35. return sumup;
  36. }
  37. vector<int> MergeSort(vector<int>& A, int l, int r){
  38. if(l==r) return {A[l]};
  39. int mid = l + (r - l) / 2;
  40. vector<int> L = MergeSort(A, l, mid);
  41. vector<int> R = MergeSort(A, mid + 1, r);
  42. return Merge(L, R);
  43. }
  44. };