leetcode笔记之[977. 有序数组的平方]

113 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

977. 有序数组的平方 - 力扣(LeetCode) (leetcode-cn.com)

给你一个按 非递减顺序 排序的整数数组 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) 的算法解决本问题

二、思路分析:

代码比较乱,但思路很简单:

  1. 先用二分法找到数组正负分界的位置(代码中的i表示从左第一个非负数,没有的话则为最后一个负数);
  2. 如果i==0(全是非负数),直接依次平方后放入新数组即可;
  3. 如果i!=0,双指针m=i-1,n=i,不越界的情况下将A[m]和A[n]中绝对值较小的平方后放入新数组。
  4. 一旦m和n有一个越界了,直接顺着另外一个方向平方后放入新数组即可。

三、AC 代码:

class Solution {
    public int[] sortedSquares(int[] A) {
        int[] arr = new int[A.length];
        int i = 0, j = A.length - 1, index = 0;
        if(A[i] < 0)
            while(i < j){
                index = (i + j) / 2;
                if(A[index] < 0) i = index + 1;
                else j = index;
            }

        if(i == 0)
            for(int k = 0; k < A.length; k ++) 
                arr[k] = A[k] * A[k];
        else{
            int m = i - 1, n = i, loc = 0;
            while(loc < A.length){
                if(m == -1){
                    for(; loc < A.length; loc++) 
                        arr[loc] = A[n] * A[n++];
                    break;
                }else if (n == A.length){
                    for(; loc < A.length; loc++)
                        arr[loc] = A[m] * A[m--];
                    break;
                }else if(A[m] + A[n] < 0){
                    arr[loc++] = A[n] * A[n++];
                }else{
                    arr[loc++] = A[m] * A[m--];
                }
            }
        }

        return arr;
    }
}