ここにカタログタイトルを書く
1.タイトルの説明
2.問題解決のアイデア
一般的に、順序付けられた配列の場合、O(n + m)の時間計算量はダブルポインター法によって達成できます。
最も簡単なアルゴリズムの実装は、ポインターp1をnums1の先頭に設定し、p2をnums2の先頭に設定し、各ステップで出力配列に最小値を設定することです。
nums1は出力用の配列であるため、nums1の最初のm個の要素を別の場所に配置する必要があります。これには、O(m)スペースの複雑さが必要です。
3.コードの実装
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// Make a copy of nums1.
int [] nums1_copy = new int[m];
System.arraycopy(nums1, 0, nums1_copy, 0, m);
// Two get pointers for nums1_copy and nums2.
int p1 = 0;
int p2 = 0;
// Set pointer for nums1
int p = 0;
// Compare elements from nums1_copy and nums2
// and add the smallest one into nums1.
while ((p1 < m) && (p2 < n))
nums1[p++] = (nums1_copy[p1] < nums2[p2]) ? nums1_copy[p1++] : nums2[p2++];
// if there are still elements to add
if (p1 < m)
System.arraycopy(nums1_copy, p1, nums1, p1 + p2, m + n - p1 - p2);
if (p2 < n)
System.arraycopy(nums2, p2, nums1, p1 + p2, m + n - p1 - p2);
}
}