1. 程式人生 > >LeetCode演算法題88:合併兩個有序陣列解析

LeetCode演算法題88:合併兩個有序陣列解析

給定兩個有序整數陣列 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]

這個題第一個想法是建立一個新的陣列,因為題目也沒有限定,建立新的陣列後直接逐個比較兩個陣列元素(需要設定兩個索引)然後放到新陣列中,最後再將新陣列內容放到num1中,但是這樣的話,空間複雜度提高了O(n),時間複雜度也變為O(2n),所以還是在原陣列上進行操作。在原陣列上進行操作時需要注意不能從前面進行操作,因為會破壞要比較的數字,所以只能從後往前遍歷,遍歷時方法是一樣的,需要設定三個索引,一個是num1前面要比較數字的索引,一個是num2的索引,還有一個是整個num1從後往前的索引,然後比較放入即可,需要注意的是,比較完之後一定會進行索引自減的操作,所以要注意不要超出操作邊界,判斷條件要充分考慮。 C++原始碼:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        if (n>0)
        {   
            int total = m + n;
            int i=m-1, j=n-1, k=total-1;
            while (total--)
            {
                if (i<0||(j>=0&&
nums1[i]<nums2[j])) nums1[k--] = nums2[j--]; else nums1[k--] = nums1[i--]; } } } };

python3原始碼:

class Solution:
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: void Do not return anything, modify nums1 in-place instead.
        """
nums1[m:] = nums2[:] nums1.sort()

python由於使用的是list,list有好的方法可以直接排序,所以只要兩個列表拼起來,用sort()方法排序即可,這個不涉及演算法,只是對語言掌握的練習,演算法還是看C++程式碼。