簡體   English   中英

如何合並兩個排序數組?

[英]How to merge two sorted array?

問題是==>給你兩個integer arrays nums1和nums2,按非降序排列,還有兩個整數m和n,分別代表nums1和nums2中元素的個數。

將 nums1 和 nums2 合並為一個按非遞減順序排序的數組。

最終排序的數組不應由 function 返回,而是存儲在數組 nums1 中。 為了適應這一點,nums1 的長度為 m + n,其中前 m 個元素表示應合並的元素,最后 n 個元素設置為 0 並應被忽略。 nums2 的長度為 n。

我的代碼有什么問題???

    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int k = 0; 
        int l = 0;
        for(int i=0; i<(m+n); i++){
            if(k > (m-1)){
                nums1[i] = nums2[l];
                l += 1;
            }
            else if(nums1[k] <= nums2[l]){
                nums1[i] = nums1[k];
                k += 1;
            }
            else {
                nums1[i] = nums2[l];
                l += 1;
            }
        }
    }
}

您的輸入

[1,2,3,0,0,0]
3
[2,5,6]
3

我的 output

[1,2,2,2,5,6]

預計 output

[1,2,2,3,5,6]

您在合並 arrays 時覆蓋了 nums1 中的值,這樣您可以在用 nums2 中的數字檢查它們之前替換 nums1 中的一些數字。 在您合並的示例中,有一段時間您有i=2k=2l=0並且您的 nums1 如下所示: nums1=[1,2,3,0,0,0] 到目前為止它看起來不錯,但現在你有nums1[k]的值為3nums2[l]的值為2所以你設置nums1[i]=nums2[l] ,即nums1[2]=nums2[0] 這樣,您將nums2中的3替換為nums1中的2 ,這樣您就丟失了原始nums1中的3 ,您將無法將其放入最終數組中。

這個問題有兩種解決方案:

  1. 輔助(臨時)數組,您將在其中放置數字,最后該數組將合並並排序 arrays 的 nums1 和 nums2,這樣您就可以將此數組復制到 nums1 中,以便將所有數字合並並排序到 nums1 中。
  2. 每次將 nums2 中的數字放入 nums1 中並放入i position 時,將所有未處理的數字從原始 nums1(來自i position 的數字到 nums1 中的最后一個非零數字)向前移動一個 position,以便您來自i position 的數字將存儲在i+1 position,之前i+1 position 的號碼將在i+2 position 等。只需保持移動這些數字的正確順序,即從最后一個非零數字開始移動它們並返回以避免在此期間丟失任何數字過程。

這些解決方案中的每一個在時間和空間復雜性方面都有其自身的優點和缺點,但作為示例,我將展示如何實現第一種方法:

public void merge(int[] nums1, int m, int[] nums2, int n) {
    int[] mergedAndSortedArray = new int[m + n];
    int k = 0;
    int l = 0;
    for(int i=0; i<(m+n); i++){
        if(k > (m-1)){
            mergedAndSortedArray[i] = nums2[l];
            l += 1;
        }
        else if(nums1[k] <= nums2[l]){
            mergedAndSortedArray[i] = nums1[k];
            k += 1;
        }
        else {
            mergedAndSortedArray[i] = nums2[l];
            l += 1;
        }
    }

    // copy final merged and sorted array to nums1, you can also do this using `for` loop but this is more efficient way
    System.arraycopy(mergedAndSortedArray, 0, nums1, 0, m + n);
}

因為在 for 循環內的 if 子句中,您基本上是將第二個數組放在第一個數組的末尾,而不測試其數字是否已被使用。

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        index = 0
        for x in range(len(nums1)):
            if index>=n:
                break
            if nums1[x]==0:
                nums1[x]=nums2[index]
                index+=1
        nums1.sort()

基於JavaScript的解決方案:

 var merge = function(nums1, m, nums2, n) { let num1Length = m-1; let num2Length = n-1; for(let i=nums1.length-1; i>=0; i--){ if(nums1[num1Length]>=nums2[num2Length]){ nums1[i] = nums1[num1Length]; num1Length--; }else if(num2Length>=0){ nums1[i] = nums2[num2Length]; num2Length--; } } }; const nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3; merge(nums1, m, nums2, n); console.log(nums1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM