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--;
}
}
}