【LeetCode-題目】有序陣列的平方
阿新 • • 發佈:2020-10-20
有序陣列的平方
題目
給定一個按非遞減順序排序的整數陣列 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; } }