zoukankan      html  css  js  c++  java
  • 【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)
  • 相关阅读:
    asp之GetArray提取链接地址,以$Array$分隔的代码
    冒泡排序的优化
    Shell中, 退出整个脚本
    Shell中的算术运算(译)
    天黑了
    你猜
    2015-12-08
    Aspen
    Spring字符集过滤器CharacterEncodingFilter
    UILocalNotification ios本地推送
  • 原文地址:https://www.cnblogs.com/flix/p/13518805.html
Copyright © 2011-2022 走看看