双指針法

1 min

双指針法(Two Pointers)

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

この問題を双指針法で書くとどうなるか?

マージソート?

class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        vector<int> res(A.size());
        int l = 0, r = A.size() - 1;
        for (int k = A.size() - 1; k >= 0; k--) {
            if (abs(A[r]) > abs(A[l])) res[k] = A[r] * A[r--];
            else res[k] = A[l] * A[l++];
        }
        return res;
    }
};
image
image

順番に並んでいるので、最初の数の絶対値と最後の数の絶対値を比較し、大きい方を後ろに置けばよい。

新しいvectorを作成することを忘れずに。