1. 程式人生 > 實用技巧 >【LeetCode-陣列】有序陣列的平方

【LeetCode-陣列】有序陣列的平方

題目描述

給定一個按非遞減順序排序的整數陣列 A,返回每個數字的平方組成的新陣列,要求也按非遞減順序排序。
示例:

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

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

說明:

  • 1 <= A.length <= 10000
  • -10000 <= A[i] <= 10000
  • A 已按非遞減順序排序。

題目連結: https://leetcode-cn.com/problems/squares-of-a-sorted-array/

思路1

將陣列平方後排序。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        if(A.empty()) return {};

        vector<int> ans;
        for(int i=0; i<A.size(); i++){
            ans.push_back(A[i]*A[i]);
        }
        sort(ans.begin(), ans.end());
        return ans;
    }
};
  • 時間複雜度:O(nlogn)
  • 空間複雜度:O(n)

思路2

因為陣列是有序的,所以可以用雙指標來做。left 指向陣列頭,right 指向陣列尾:

  • 如果 left<=right,迴圈:
    • 如果 nums[left]+nums[right]<0,說明 nums[left] 為負數且 nums[left]^2>nums[right]^2,此時將 nums[left] 的平方放入答案中,left++;
    • 否則,說明 nums[left]^2<=nums[right]^2,將 nums[right]^2 放入答案中,right--;

程式碼如下:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        if(A.empty()) return {};

        vector<int> ans(A.size(), 0);
        int left = 0;
        int right = A.size()-1;
        int k = right;
        while(left<=right){
            if(A[left]+A[right]<0){
                ans[k--] = A[left]*A[left];
                left++;
            }else{
                ans[k--] = A[right]*A[right];
                right--;
            }
        }
        return ans;
    }
};
  • 時間複雜度:O(n)
  • 空間複雜度:O(n)