<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 0088. 合并兩個有序數組 ## 題目地址(88. 合并兩個有序數組) <https://leetcode-cn.com/problems/merge-sorted-array/> ## 題目描述 ``` <pre class="calibre18">``` 給定兩個有序整數數組 nums1 和 nums2,將 nums2 合并到 nums1 中,使得 num1 成為一個有序數組。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。 你可以假設 nums1 有足夠的空間(空間大小大于或等于 m + n)來保存 nums2 中的元素。 示例: 輸入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 輸出: [1,2,2,3,5,6] ``` ``` ## 公司 - 阿里 - 騰訊 - 百度 - 字節 - loomberg - facebook - microsoft ## 前置知識 - 歸并排序 ## 思路 符合直覺的做法是`將nums2插到num1的末尾, 然后排序` 具體代碼: ``` <pre class="calibre18">``` <span class="hljs-title">// 這種解法連m都用不到</span> <span class="hljs-title">// 這顯然不是出題人的意思</span> <span class="hljs-keyword">if</span> (n === <span class="hljs-params">0</span>) <span class="hljs-keyword">return</span>; <span class="hljs-keyword">let</span> current2 = <span class="hljs-params">0</span>; <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = nums1.length - <span class="hljs-params">1</span>; i >= nums1.length - n; i--) { nums1[i] = nums2[current2++]; } nums1.sort((a, b) => a - b); <span class="hljs-title">// 當然你可以自己寫排序,這里懶得寫了,因為已經偏離了題目本身</span> ``` ``` 這道題目其實和基本排序算法中的`merge sort`非常像,但是 merge sort 很多時候,合并的時候我們通常是 新建一個數組,這樣就很簡單。 但是這道題目要求的是`原地修改`. 這就和 merge sort 的 merge 過程有點不同,我們先來回顧一下 merge sort 的 merge 過程。 merge 的過程`可以`是先比較兩個數組的頭元素,然后將較小的推到最終的數組中,并將其從原數組中出隊列。 循環直到兩個數組都為空。 具體代碼如下: ``` <pre class="calibre18">``` <span class="hljs-title">// 將nums1 和 nums2 合并</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">merge</span>(<span class="hljs-params">nums1, nums2</span>) </span>{ <span class="hljs-keyword">let</span> ret = []; <span class="hljs-keyword">while</span> (nums1.length || nums2.length) { <span class="hljs-title">// 為了方便大家理解,這里代碼有點贅余</span> <span class="hljs-keyword">if</span> (nums1.length === <span class="hljs-params">0</span>) { ret.push(nums2.shift()); <span class="hljs-keyword">continue</span>; } <span class="hljs-keyword">if</span> (nums2.length === <span class="hljs-params">0</span>) { ret.push(nums1.shift()); <span class="hljs-keyword">continue</span>; } <span class="hljs-keyword">const</span> a = nums1[<span class="hljs-params">0</span>]; <span class="hljs-keyword">const</span> b = nums2[<span class="hljs-params">0</span>]; <span class="hljs-keyword">if</span> (a > b) { ret.push(nums2.shift()); } <span class="hljs-keyword">else</span> { ret.push(nums1.shift()); } } <span class="hljs-keyword">return</span> ret; } ``` ``` 這里要求原地修改,其實我們能只要從后往前比較,并從后往前插入即可。 我們需要三個指針: 1. current 用于記錄當前填補到那個位置了 2. m 用于記錄 nums1 數組處理到哪個元素了 3. n 用于記錄 nums2 數組處理到哪個元素了 如圖所示: - 灰色代表 num2 數組已經處理過的元素 - 紅色代表當前正在進行比較的元素 - 綠色代表已經就位的元素 ![](https://img.kancloud.cn/15/d8/15d82e9142c52e3429091e20b7d0f2b4_612x829.jpg)![](https://img.kancloud.cn/98/30/9830fa745d6a507656cac3ddff51bee7_499x309.jpg)![](https://img.kancloud.cn/24/24/242422fbe043034cd0dc76f575536767_442x259.jpg) ## 關鍵點解析 - 從后往前比較,并從后往前插入 ## 代碼 代碼支持:Python3, C++, Java, JavaScript JavaSCript Code: ``` <pre class="calibre18">``` <span class="hljs-keyword">var</span> merge = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">nums1, m, nums2, n</span>) </span>{ <span class="hljs-title">// 設置一個指針,指針初始化指向nums1的末尾(根據#62,應該是index為 m+n-1 的位置,因為nums1的長度有可能更長)</span> <span class="hljs-title">// 然后不斷左移指針更新元素</span> <span class="hljs-keyword">let</span> current = m + n - <span class="hljs-params">1</span>; <span class="hljs-keyword">while</span> (current >= <span class="hljs-params">0</span>) { <span class="hljs-title">// 沒必要繼續了</span> <span class="hljs-keyword">if</span> (n === <span class="hljs-params">0</span>) <span class="hljs-keyword">return</span>; <span class="hljs-title">// 為了方便大家理解,這里代碼有點贅余</span> <span class="hljs-keyword">if</span> (m < <span class="hljs-params">1</span>) { nums1[current--] = nums2[--n]; <span class="hljs-keyword">continue</span>; } <span class="hljs-keyword">if</span> (n < <span class="hljs-params">1</span>) { nums1[current--] = nums1[--m]; <span class="hljs-keyword">continue</span>; } <span class="hljs-title">// 取大的填充 nums1的末尾</span> <span class="hljs-title">// 然后更新 m 或者 n</span> <span class="hljs-keyword">if</span> (nums1[m - <span class="hljs-params">1</span>] > nums2[n - <span class="hljs-params">1</span>]) { nums1[current--] = nums1[--m]; } <span class="hljs-keyword">else</span> { nums1[current--] = nums2[--n]; } } }; ``` ``` C++ code: ``` <pre class="calibre18">``` class Solution { public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { int current = m + n - 1; while (current >= 0) { if (n == 0) return; if (m < 1) { nums1[current--] = nums2[--n]; continue; } if (n < 1) { nums1[current--] = nums1[--m]; continue; } if (nums1[m - 1] > nums2[n - 1]) nums1[current--] = nums1[--m]; else nums1[current--] = nums2[--n]; } } }; ``` ``` Java Code: ``` <pre class="calibre18">``` <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Solution</span> </span>{ <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">merge</span><span class="hljs-params">(<span class="hljs-keyword">int</span>[] nums1, <span class="hljs-keyword">int</span> m, <span class="hljs-keyword">int</span>[] nums2, <span class="hljs-keyword">int</span> n)</span> </span>{ <span class="hljs-keyword">int</span> i=m-<span class="hljs-params">1</span>, j=n-<span class="hljs-params">1</span>, k=m+n-<span class="hljs-params">1</span>; <span class="hljs-title">// 合并</span> <span class="hljs-keyword">while</span>(i>=<span class="hljs-params">0</span> && j>=<span class="hljs-params">0</span>) { <span class="hljs-keyword">if</span>(nums1[i] > nums2[j]) { nums1[k--] = nums1[i--]; } <span class="hljs-keyword">else</span> { nums1[k--] = nums2[j--]; } } <span class="hljs-title">// 合并剩余的nums2</span> <span class="hljs-keyword">while</span>(j>=<span class="hljs-params">0</span>) { nums1[k--] = nums2[j--]; } } } ``` ``` Python Code: ``` <pre class="calibre18">``` <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Solution</span>:</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">merge</span><span class="hljs-params">(self, nums1: List[int], m: int, nums2: List[int], n: int)</span> -> <span class="hljs-keyword">None</span>:</span> <span class="hljs-string">""" Do not return anything, modify nums1 in-place instead. """</span> <span class="hljs-title"># 整體思路相似,只不過沒有使用 current 指針記錄當前填補位置</span> <span class="hljs-keyword">while</span> m > <span class="hljs-params">0</span> <span class="hljs-keyword">and</span> n > <span class="hljs-params">0</span>: <span class="hljs-keyword">if</span> nums1[m<span class="hljs-params">-1</span>] <= nums2[n<span class="hljs-params">-1</span>]: nums1[m+n<span class="hljs-params">-1</span>] = nums2[n<span class="hljs-params">-1</span>] n -= <span class="hljs-params">1</span> <span class="hljs-keyword">else</span>: nums1[m+n<span class="hljs-params">-1</span>] = nums1[m<span class="hljs-params">-1</span>] m -=<span class="hljs-params">1</span> <span class="hljs-string">""" 由于沒有使用 current,第一步比較結束后有兩種情況: 1. 指針 m>0,n=0,此時不需要做任何處理 2. 指針 n>0,m=0,此時需要將 nums2 指針左側元素全部拷貝到 nums1 的前 n 位 """</span> <span class="hljs-keyword">if</span> n > <span class="hljs-params">0</span>: nums1[:n] = nums2[:n] ``` ``` **復雜度分析** - 時間復雜度:O(M+N)O(M + N)O(M+N) - 空間復雜度:O(1)O(1)O(1) 歡迎關注我的公眾號《腦洞前端》獲取更多更新鮮的 LeetCode 題解 ![](https://img.kancloud.cn/77/1d/771d6f53e2a51febbcb6fa97f2899ac3_1586x578.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看