Skip to content
本页目录

0977-有序数组的平方

https://leetcode.cn/problems/squares-of-a-sorted-array

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

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:

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

提示:

  • 1 <= nums.length <= 10^4
  • 10^4 <= nums[i] <= 10^4
  • nums 已按 非递减顺序 排序

进阶:

请你设计时间复杂度为 O(n) 的算法解决本问题

思路

因为原来数组是按照递减排序的,所以负数的平方会变大,一直到0,然后正数的平方依次递增。 因此从两边开始循环,将平方比较,将大的平方结果放到右边小的放到左边做下一次比较,这样循环结束的时候,最小的就在最左边。

参考代码

csharp
public class Solution {

    //暴力法就是先做平方,再排序,略去

    //基本思路: 原先就是有序数组,平方之后,就是负数变成正数了
    //所以最大的数一定在两边,不在中间
    //使用双指针,从两边分别往中间靠近,填入数组也从后往前
    public int[] SortedSquares(int[] nums) {

        int[] result = new int[nums.Length];
        int left = 0;
        int right = nums.Length - 1;
        
        for(int i = nums.Length - 1; i>=0; i--){
            if(nums[right] * nums[right] > nums[left] * nums[left]){
                result[i] = nums[right] * nums[right];
                right--;
            }
            else{
                result[i] = nums[left] * nums[left];
                left++;
            }
        }

        return result;
    }
}

Released under the MIT License.