ソートアレイ


問題リンク:https://leetcode.com/problems/merge-sorted-array/
ソリューションビデオhttps://youtu.be/hVl2b3bLzBw , によって
解決方法
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
      int i= m-1;
      int j= n-1;
      int k= m+n-1;
     while(i>=0 && j>=0){
      //nums2[j] is larger value so it will go at k 
            if(nums1[i]<nums2[j]){
                nums1[k--] = nums2[j--];
            }else{
                nums1[k--] = nums1[i--];
            }
        }
        //If length of nums2 is more than length of nums1
        while(j>=0){
            nums1[k--] = nums2[j--];
        }
    }
}
つのアプローチは、最初から始まるか終わりから始まるかどうか、配列への2つのポインタを作成することです.配列から要素を挿入するために使用します.配列がすでにソートされているので、配列の後ろに大きな要素を配置しやすくなります.
アプローチ:私たちはnums 1 []とnums 2 []の配列の要素を比較するために2つのポインタを作成します.これは3番目のポインタkです.したがってポインタ値は-
I = M - 1 ;j = n - 1 ;k = m + n - 1 ;
nums 1 [ i ]とnumns 2 [ j ]とを比較します.これらの要素のうち、大きい方が大きい場合は、kポインタインデックスでその要素を挿入し、より大きなポインタとkポインタを1で除します.
JまたはIが0になるまでループを続けます.したがって、全体の動作はしばらくの間実行されます(j>= 0 - 1 - 1 = 0)
トラップ
  • インデックスを正しく設定することはできません.
  • インデックスの代入演算子:nums1[k] = nums2[j]; k--; j--;
    以下のように書きます.nums1[k--] = nums2[j--];
    操作が最初に完了するようにnums1[k] = nums2[j] その後、' k 'と' j 'にデクリメントがあります.
  • 他のループを作成するのではなく、他のループを使用する場合は、時間の複雑さの制限を超えて終了します.
    このアルゴリズムの時間複雑度:O(n + m)はk要素を挿入しているので
  • 配列のうちの1つが以前に終わることがない可能性があるかもしれないので、我々はコードの余分の行を加えるかもしれないのを扱います.
  • while(i>=0){
    nums1[k--]= nums1[i--];
    }
    while(j>=0){
    nums1[k--]= nums2[j--];
    }
    
    
    この特定の問題では、nums 1 []がnums 2 []から要素を埋めるのに十分なスペースをすでに与えられているので、新しい配列を作成する必要はありません.