合併排序數組是一個經典問題,了解如何有效解決它對於編碼面試至關重要。在這篇文章中,我們將使用 JavaScript 來解決 LeetCode 的 88. 合併排序數組,這是頂級面試 150 個問題挑戰的一部分。讓我們深入研究這個問題、它的細微差別以及一個乾淨、最佳的解決方案!
?問題描述
給定兩個整數數組 nums1 和 nums2,按非降序排序。您的任務是將 nums2 合併到 nums1 中,使 nums1 保持排序狀態。
但是,有一個轉捩點:
nums1 有足夠的空間(設定為 0s)來容納 nums2 的元素。
最終的合併結果必須就地儲存在 nums1 中。
?範例
範例1
Input: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 Output: [1,2,2,3,5,6]
範例2
Input: nums1 = [1], m = 1, nums2 = [], n = 0 Output: [1]
範例3
Input: nums1 = [0], m = 0, nums2 = [1], n = 1 Output: [1]
?主要見解
? JavaScript 解決方案:兩指標方法
最佳解法利用雙指標方法,從兩個陣列的末端開始。這確保了最大的元素首先放置,避免不必要的元素移動。
var merge = function(nums1, m, nums2, n) { // Initialize pointers for nums1, nums2, and the last index of nums1 let p1 = m - 1; let p2 = n - 1; let p = m + n - 1; // Compare elements from the end and place the largest at the back while (p1 >= 0 && p2 >= 0) { if (nums1[p1] > nums2[p2]) { nums1[p] = nums1[p1]; p1--; } else { nums1[p] = nums2[p2]; p2--; } p--; } // Copy remaining elements from nums2 (if any) while (p2 >= 0) { nums1[p] = nums2[p2]; p2--; p--; } };
?工作原理
從末尾開始:
比較 nums1 和 nums2 的最大元素(使用 p1
和 p2 指標)。將較大的元素放在
的末尾
nums1(使用 p 指標)。
遞減指針:
在處理元素時移動 p1、p2 和 p。
處理剩餘元素:
如果 nums2 中還有剩餘元素,則複製到 nums1 中。 (沒有
需要從 nums1 複製元素,因為它們已經就位。 )
?複雜度分析
?試運行
輸入:
nums1 = [1,2,3,0,0,0],m = 3,nums2 = [2,5,6],n = 3
步驟 p1 p2 p nums1
初始化 2 2 5 [1,2,3,0,0,0]
1 2 2 5 [1,2,3,0,0,6]
2 2 1 4 [1,2,3,0,5,6]
3 2 0 3 [1,2,3,3,5,6]
4 1 0 2 [1,2,2,3,5,6]
5 0 0 1 [1,2,2,3,5,6]
最終輸出:[1,2,2,3,5,6]
?自己嘗試吧!
查看 LeetCode 上的完整問題和測試案例。挑戰自己,在不看程式碼的情況下實現解決方案!
✨ 面試專業技巧
有任何問題或見解嗎?在下面的評論中分享吧!我們一起來學習吧。 ?
以上是LeetCode 挑戰:合併排序數組 - JavaScript 解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!