最後一篇就決定是:88. Merge Sorted Array
題目大意是:給你兩個已按非遞減順序 (Non-decreasing Order)** 排列的整數數組 nums1 和 nums2,以及兩個整數 $m$ 和 $n$,分別表示 nums1 和 nums2 中元素的數量。**請將 nums2 合併到 nums1 中,使合併後的數組仍然按非遞減順序排列。
約束條件:最終的有序數組應儲存在 nums1 中。nums1 的長度等於 $m + n$,其中前 $m$ 個元素是要合併的元素,後 $n$ 個元素是 $0$ (用來預留空間,應該被忽略)。
class Solution {
/**
* LeetCode 88: Merge Sorted Array
* 使用從後往前雙指針法,在 O(1) 額外空間和 O(m+n) 時間內原地合併兩個有序數組。
* * @param nums1 接收合併結果的數組 (長度為 m+n)
* @param m nums1 中的有效元素數量
* @param nums2 待合併的數組 (長度為 n)
* @param n nums2 中的元素數量
* @return void (直接修改 nums1)
*/
public void merge(int[] nums1, int m, int[] nums2, int n) {
// p1 指向 nums1 有效部分的末尾 (m-1)
int p1 = m - 1;
// p2 指向 nums2 的末尾 (n-1)
int p2 = n - 1;
// p 指向合併後結果將要放置的位置 (m + n - 1)
int p = m + n - 1;
// 1. 主合併迴圈:當兩個數組都有元素時,進行比較並從後往前放置較大者
while (p1 >= 0 && p2 >= 0) {
// 比較當前指針所指的元素
if (nums1[p1] > nums2[p2]) {
// 將 nums1 中較大的元素放置到末尾
nums1[p] = nums1[p1];
p1--; // nums1 指針前移
} else {
// 將 nums2 中較大的元素或相等元素放置到末尾
nums1[p] = nums2[p2];
p2--; // nums2 指針前移
}
// 合併位置指針前移
p--;
}
// 2. 處理剩餘元素:
// 如果 nums2 還有剩餘元素 (p2 >= 0),說明它們都比 nums1 中所有剩餘元素小。
// 將 nums2 中剩餘的元素直接複製到 nums1 的開頭。
// (如果 nums1 還有剩餘元素,無需操作,因為它們已經在正確的位置上。)
while (p2 >= 0) {
nums1[p] = nums2[p2];
p2--;
p--;
}
}
}
下台一鞠躬~~~