leetcode 88. 合併兩個有序陣列
阿新 • • 發佈:2020-08-01
題目描述
我的題解
!!!記住:一般而言,對於有序陣列可以通過 雙指標法 達到 O(n + m) 的時間複雜度。
(要開闢新空間的方法就不說了)
方法:雙指標(從後往前)
思路分析
- 不開闢新空間,直接在 nums1 陣列上操作。
- 一般而言我們會想到從前往後分別遍歷 nums1 和 nums2。但是這樣的話,交換數字之類的超麻煩,似乎也不容易實現!
- 那麼,既然能從前往後,反正又是有序陣列,那我也能從後往前呀,似乎並沒有啥區別。能前往後,自然也能後往前嘛。
- 而前往後的缺點就是空間不夠。那後往前呢?我們最終是要把 nums2 放進 nums1 裡的,那 nums1 後面不是還有 n 個位置的空間嘛!空間這麼多,就不怕交換位置造成的麻煩啦!
- 指標 i、j 分別指向 nums1、nums2 最後一個元素,而 cur 指標為當前可以放入的位置。
程式碼如下
public void merge(int[] nums1, int m, int[] nums2, int n) { if (n == 0 || nums2 == null || nums1 == null) return; if (m == 0) { if (nums2 != null) { for (int i = 0; i < n; i++) nums1[i] = nums2[i]; } return; } int i = m - 1; int j = n - 1; int cur = m + n - 1; while (j >= 0) { if (nums1[i] > nums2[j]) { nums1[cur--] = nums1[i--]; } else { nums1[cur--] = nums2[j--]; } if (i == -1) { // num1前m個元素的遍歷結束了 while (j != -1) nums1[cur--] = nums2[j--]; } } // System.out.println(Arrays.toString(nums1)); }