2 つの順序付けされた配列をマージする [leetcode]

1. 質問:

非減少順に配置された 2 つの整数配列 nums1 と nums2 と、それぞれ nums1 と nums2 の要素の数を表す 2 つの整数 m と n が与えられます。

結合された配列も降順に配置されるように、nums2 を nums1 に結合してください。

注: 最終的に、マージされた配列は関数によって返されるのではなく、配列 nums1 に格納される必要があります。この状況に対処するために、nums1 の初期長は m + n です。ここで、最初の m 要素はマージする必要がある要素を表し、最後の n 要素は 0 であるため無視する必要があります。nums2 の長さは n です。

2. アイデア:

毎回 2 つの配列内の最大の要素を比較するだけです。

① まず、2 つの配列の最大の要素を比較します。大きい方の要素は num1 配列の m+n-1 の位置に配置され、現在の要素の元の位置インデックス (m または n) が減算され、目的は下向きです。比較される要素であり、num1 の空の位置インデックスも減算する必要があります。目的は、次の空の位置を指すことです。ここでは、m+n-1 を使用して空の位置インデックスを表します。 m または n が減算されると、それに応じて空の位置インデックスも減ります。

② この比較処理を繰り返す必要がありますが、いつ終了しますか? 比較位置が左端に達すると、つまりインデックスが 0 になると、比較できなくなります。これは、ここでの m-1 と n-1 が 2 つの配列のそれぞれのインデックスであり、ループ条件が m > であるためです。 0 && n > 0、配列が最後まで走査されている限り、ループを終了します。

③ 条件が満たされない場合にループを抜けた後、n<0 であるが m>0 または n と m の両方が 0 より小さい場合、num2 のすべての要素が num1 に挿入されたことを意味し、マージが完了します。現時点では;

④ m<0 であるが、n>0 の場合、この状況は、num1 のすべての要素が比較され、num2 の要素だけが挿入を待っていることを意味します。そのため、この時点で、num1 の要素を比較するために while ループも必要になります。 num2 の要素 num1 に順番に挿入します。空の位置のインデックスは依然として m+n-1 です。n が 0 になるまで、毎回 n が減算されます。

3. コードの実装:

class Solution {
    
    
    public void merge(int[] nums1, int m, int[] nums2, int n) {
    
    
        while (m > 0 && n > 0) {
    
    
            if(nums1[m - 1] > nums2[n - 1]) {
    
    
                nums1[m + n - 1] = nums1[m - 1];
                m--;
            } else {
    
    
                nums1[m + n - 1] = nums2[n - 1];
                n--;
            }
        }

        while (n > 0) {
    
    
            nums1[m + n - 1] = nums2[n - 1];
            n--;
        }
    }
}

おすすめ

転載: blog.csdn.net/m0_52861684/article/details/132384708