1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        每日一道 LeetCode (19):合并兩個有序數(shù)組

        共 1148字,需瀏覽 3分鐘

         ·

        2020-08-15 10:35

        ?

        每天 3 分鐘,走上算法的逆襲之路。

        ?

        前文合集

        每日一道 LeetCode 前文合集

        代碼倉庫

        GitHub:https://github.com/meteor1993/LeetCode

        Gitee:https://gitee.com/inwsy/LeetCode

        題目:合并兩個有序數(shù)組

        題目來源:https://leetcode-cn.com/problems/merge-sorted-array/

        給你兩個有序整數(shù)數(shù)組 nums1 和 nums2,請你將 nums2 合并到 nums1 中,使 nums1 成為一個有序數(shù)組。

        說明:

        初始化 nums1 和 nums2 的元素?cái)?shù)量分別為 m 和 n 。

        你可以假設(shè) 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]

        解題方案

        這道題單純的從排序上來講并不是難題,畢竟題目中已經(jīng)給出來兩個有序的數(shù)組了,最簡單的循環(huán)一下長數(shù)組,然后挨個比較下兩個數(shù)組元素的大小,放到一個新數(shù)組里面就完事兒了。

        這道題的難點(diǎn)在于,我們需要在 nums1 數(shù)組中,完成兩個數(shù)組的排序,這個就稍微有點(diǎn)坑了,這相當(dāng)于要把 nums2 合并到 nums1 當(dāng)中,還得要有序的合并進(jìn)去。

        這個彎有點(diǎn)難繞的,題目中雖然說最終的結(jié)果要在 nums1 當(dāng)中,但是并沒有說不允許我們創(chuàng)建第三個數(shù)組啊,我可以創(chuàng)建一個新的數(shù)組,把 nums1 copy 到新的數(shù)組中,然后再在 nums1 當(dāng)中完成排序,這不也行么。

        接下來就是代碼時間,很簡單,定義了兩個指針,一個是 copy_nums1 的指針,還有一個是 nums2 的指針,通過移動這兩個指針,來完成整個排序工作。

        //?從前往后
        public?void?merge(int[]?nums1,?int?m,?int[]?nums2,?int?n)?{
        ????int[]?copy_nums1?=?new?int[m];
        ????System.arraycopy(nums1,?0,?copy_nums1,?0,?m);

        ????//?copy_nums1?的指針
        ????int?n1?=?0;
        ????//?nums2?的指針
        ????int?n2?=?0;
        ????//?nums1?的指針
        ????int?n0?=?0;

        ????while?((n1?????????nums1[n0++]?=?copy_nums1[n1]?????}

        ????if?(n1?????????System.arraycopy(copy_nums1,?n1,?nums1,?n1?+?n2,?m?+?n?-?n1?-?n2);
        ????}
        ????if?(n2?????????System.arraycopy(nums2,?n2,?nums1,?n1?+?n2,?m?+?n?-?n1?-?n2);
        ????}
        }

        上面這種方案雖說能解決問題,但是有一點(diǎn)不大好,就是新建了一個數(shù)組,多占用了一個數(shù)組的空間,既然題上說 nums1 的長度足夠上,我們從小到大排序不好排,那么如果是從大到小呢?

        思路基本上還是一個思路,定義兩個指針,然后倒序的將元素裝到 nums1 里面。

        //?從后往前
        public?void?merge_1(int[]?nums1,?int?m,?int[]?nums2,?int?n)?{
        ????//?nums1?有數(shù)據(jù)的尾部指針
        ????int?n1?=?m?-?1;
        ????//?nums2?的尾部指針
        ????int?n2?=?n?-?1;
        ????//?nums1?最終的尾部指針
        ????int?n0?=?m?+?n?-?1;

        ????while?((n1?>=?0)?&&?(n2?>=?0))?{
        ????????nums1[n0--]?=?nums1[n1]?????}

        ????System.arraycopy(nums2,?0,?nums1,?0,?n2?+?1);
        }

        今天這兩道題都不難,基本上搞清楚了方案以后,就是寫寫代碼練練手。

        感謝閱讀



        瀏覽 53
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            无码色欲| 成人免费网站在线观看 | 成人做爰黄 片免费观看视频视频 | 女人脱了裤衩让男人捅视频 | 女生被c视频 | 人妻人人揉人人躁人人 | 操逼操逼操逼操逼 | 国产精品国产三级国快看 | 天天干无码视频 | 国产无码久久久 |