1. 程式人生 > 實用技巧 >【LeetCode-題目】有序陣列的平方

【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;
    }
}