【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)
posted @ 2020-08-17 17:23  Flix  阅读(185)  评论(0编辑  收藏  举报