iT邦幫忙

2025 iThome 鐵人賽

0

最後一篇就決定是: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--;
        }
    }
}

下台一鞠躬~~~


上一篇
今天的題目是: 746. Min Cost Climbing Stairs
系列文
Chatting with ChatGPT——一天學習一題Leetcode30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言