LeetCode 977 有序数组的平方 HERODING的LeetCode之路

给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。

示例 1:

输入:[-4,-1,0,3,10]
输出:[0,1,9,16,100]

示例 2:

输入:[-7,-3,2,3,11]
输出:[4,9,9,49,121]

提示:

1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A 已按非递减顺序排序。

解题思路:
第一个思路就是遍历整个数组,取出每个值平方放入另一个数组中,并进行排序,返回该数组即可。但是很明显,该方法的效率并不高,代码如下:

class Solution {
    
    
public:
    vector<int> sortedSquares(vector<int>& A) {
    
    
        vector<int> ans;
        for(int i = 0; i < A.size(); i ++){
    
    
            int num = A[i];
            ans.push_back(num*num);
        }
        sort(ans.begin(),ans.end());
        return ans;
    }
};

第二种方法是个双指针的方法,也是特别好用的方法,而且执行效率高,使用两个指针分别指向位置 0 和 n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针。这种方法无需处理某一指针移动至边界的情况,代码如下:

class Solution {
    
    
public:
    vector<int> sortedSquares(vector<int>& A) {
    
    
        int n = A.size();
        vector<int> ans(n);
        for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {
    
    
            if (A[i] * A[i] > A[j] * A[j]) {
    
    
                ans[pos] = A[i] * A[i];
                ++i;
            }
            else {
    
    
                ans[pos] = A[j] * A[j];
                --j;
            }
            --pos;
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/HERODING23/article/details/109111401