天天看點

88. Merge Sorted Array 合并兩個有序數組

題目分析:将2個有序的數列合并成一個有序的數列。思路就是從2個數列的末尾開始看,比較哪個大,将最大的數作為合并到nums1的最後一位數,以此類推,周遊完其中一個數列結束,最後判斷nums2是否為空來判斷合并是否完成,因為全部合到nums1中,是以隻需要判斷nums2就行

C++:

這裡有個用multiset的方法,利用容器的特點去解

void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
    //multiset
//    if(m == 0)
//    {
//        swap(nums1,nums2);
//        return;
//    }

    int len1 = m - 1;
    int len2 = n - 1;
    int len = n + m - 1;

    while (len1 >= 0 && len2 >= 0){
        nums1[len--] = nums1[len1] > nums2[len2] ? nums1[len1--] : nums2[len2--];
    }

    while (len2 >= 0){
        nums1[len--] = nums2[len2--]; #合并nums2剩餘元素
    }
}
           

Python:

這裡在自己的編譯器寫的時候出現了錯誤:

list assignment index out of range

這是因為題目中直接給出了n+m長度的nums1,出了後面n個元素全為0,是以不需要判斷nums1是否為空,也不需要在nums1後面再加n個0元素初始化,是以題解代碼沒有出錯。

而編譯器我在寫的時候沒有這樣輸入,隻是給個nums1,m個元素是以nums[n+m+1]超出m個元素後面的是沒有初始化元素的,直接指派則會出現越界的錯誤,需要用插入的方式指派。

list的插入可以用:

1.extend:用于在清單末尾一次性追加另一個序列中的多個值(用新清單擴充原來的清單)

2.append:用于在清單末尾添加新的對象

3.insert:用于将指定對象插入清單的指定位置

4.直接加

或者可以自己給後面的元素初始化為0

L = [0]*n
    nums1 += L
           
def merge(nums1: list, m: int, nums2: list, n: int):
    len1 = m - 1
    len2 = n - 1
    len = n + m - 1


    while len1 >= 0 and len2 >= 0:
        if nums1[len1] >= nums2[len2]:
            nums1[len] = nums1[len1]
            len1 -= 1
            len -= 1
        else:
            nums1[len] = nums2[len2]
            len2 -= 1
            len -= 1


    if len2 >= 0:
        nums1[:len2+1] = nums2[:len2+1] #合并nums2中剩餘的元素