[LeetCode-Java演習]88。2つの順序付けられた配列を組み合わせる(単純)

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

おすすめ

転載: blog.csdn.net/weixin_48683410/article/details/114198764