【LeetCode-题目】有序数组的平方

有序数组的平方

题目

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

实例

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

想法

先看看菜鸟三思的思路:

  • 将输入先进行平方和
  • 然后将剩下结果进行排序

这里是官方题解:

  • 由于是非递减顺序的数组,因此可以先寻找一个距离0最近的值
  • 根据此值可以将数组分为两部分。后面可以根据归并排序来合并数组
  • 归并排序合并数组
    • 使用双指针对这两个数组进行遍历
    • 优先将绝对值较小的数值放入新数组
    • 当某个数组遍历完成后,将剩下数组的数据放入新数组

代码

使用归并排序的代码

class Solution {
    public int[] sortedSquares(int[] A) {
        int[] B = new int[A.length];
        int mid = getMid(A);
        int l = mid - 1;
        int r = mid + 1;
        int ind = 0;
        B[ind++] = (int) Math.pow(A[mid], 2);
        while (l>=0 && r<A.length) { //左右指针比较
            if (Math.abs(A[l]) <= Math.abs(A[r])) { //左边数据较小
                B[ind++] = (int) Math.pow(A[l--], 2);
            }else { //右边数据较小
                B[ind++] = (int) Math.pow(A[r++], 2);
            }
        }
        while (l>=0) { //左边还有剩余数据
            B[ind++] = (int) Math.pow(A[l--], 2);
        }
        while (r<A.length) { //右边数据还有剩余
             B[ind++] = (int) Math.pow(A[r++], 2);
        }
        return B;
    }

    /**
    * 获得最接近0的下标
    **/
    public int getMid(int[] A) {
        int min = Integer.MAX_VALUE;
        int ind = 0;
        for (int i=0;i<A.length;i++) {
            if (min >= Math.abs(A[i])) {
                min = Math.abs(A[i]);
                ind = i;
            }else {
                return i-1;
            }
        }
        return ind;
    }
}
posted @ 2020-10-18 19:39  三思之客  阅读(148)  评论(0)    收藏  举报