2つの順序付けられた配列を組み合わせる
質問では、
2つの順序付き整数配列nums1とnums2を指定し、nums2の整数をnums1にマージし、nums1も順序付き配列にするように求められます。 スペースの複雑さを最小限に抑えるための
アイデア
、新しい配列を作成することはできません。直接nums1に入れる必要があります。時間の複雑さをできるだけ小さくする必要があることを考慮して、配列内の2つの要素を比較できます。nums1では、添え字は小さいですが、これによりnums1の元の値が上書きされることを考慮して、nums1のサイズは2つの配列のすべての要素を収めるのに十分であると想定し、後ろから前に放電できます。つまり、要素2つの配列のが比較され、大きい方の要素がnums1配列の最後に配置され、配列がいっぱいになるまで逆の塗りつぶしが実行されます。
コード
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int p = m + n - 1;
int p1 = m - 1;
int p2 = n - 1;
while (p1 >= 0 && p2 >= 0)
{
if (nums1[p1] >= nums2[p2])
{
nums1[p] = nums1[p1];
p1--;
}
else
{
nums1[p] = nums2[p2];
p2--;
}
p--;
}
if (p1 == -1)
{
while (p2 >= 0)
{
nums1[p] = nums2[p2];
p2--;
p--;
}
}
}