力扣学习笔记:997:有序数组的平方

题目
算法

  • 我们用双指针算法解题
  • 写题过程:一开始我找的标准是第一个大于等于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;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_45914759/article/details/109122260