LeetCode88. 合併兩個有序陣列
阿新 • • 發佈:2021-06-16
LeetCode88. 合併兩個有序陣列
題目說明
/**
*
* 給你兩個有序整數陣列nums1 和 nums2,
* 請你將 nums2 合併到nums1中,使 nums1 成為一個有序陣列。
* <p>
* 初始化nums1 和 nums2 的元素數量分別為m 和 n 。
* 你可以假設nums1 的空間大小等於m + n,
* 這樣它就有足夠的空間儲存來自 nums2 的元素。
*
*/
思路分析
- 因為給定的陣列是有序的,即按照升序排列的,假定陣列1的長度為兩陣列長度之和,將合併後的元素儲存到陣列1中
- 可以使用逆向遍歷法,即從陣列的後邊往前遍歷,因為陣列的後邊元素更大,而且陣列1後邊的部分元素是空的,從後往前依次比較兩個陣列中元素的大小,將較大者依次儲存陣列1的後邊
- 當某一陣列中其他元素全部取完後,則直接從剩下的一個數組中取
- 原始碼見下
原始碼及分析
/** * * @param nums1 要合併的陣列1 * @param m 陣列1的長度 * @param nums2 要合併的陣列2 * @param n 陣列2的長度 */ public void merge(int[] nums1, int m, int[] nums2, int n) { //定義兩個指標指向兩個陣列末尾,從後往前遍歷,因為陣列是有序的,即陣列後邊的元素大於前邊的 int i = m - 1, j = n - 1; //再定義指標k用於將陣列中比較後較大的值依次放入陣列末尾,cur記錄當前的較大的數 int k = m + n - 1, cur = 0; //迴圈掃描兩個陣列 while (i >= 0 || j >= 0) { //如果第一個陣列已經掃描完畢,則將第二個陣列的所有元素全部放入num1 if (i == -1) { cur = nums2[j]; j--; //同理如果第二個陣列掃描完畢 } else if (j == -1) { cur = nums1[i]; i--; //比較兩個陣列中末尾的元素大小,將大者先放入num1 } else if (nums1[i] > nums2[j]) { cur = nums1[i]; i--; } else { cur = nums2[j]; j--; } //迴圈將較大者存入陣列 nums1[k] = cur; k--; } }