ソートアレイ
1928 ワード
問題リンク:https://leetcode.com/problems/merge-sorted-array/
ソリューションビデオhttps://youtu.be/hVl2b3bLzBw , によって
解決方法
アプローチ:私たちは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)
トラップ インデックスを正しく設定することはできません. インデックスの代入演算子:
以下のように書きます.
操作が最初に完了するように 他のループを作成するのではなく、他のループを使用する場合は、時間の複雑さの制限を超えて終了します.
このアルゴリズムの時間複雑度:O(n + m)はk要素を挿入しているので 配列のうちの1つが以前に終わることがない可能性があるかもしれないので、我々はコードの余分の行を加えるかもしれないのを扱います.
ソリューションビデオ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要素を挿入しているので
while(i>=0){
nums1[k--]= nums1[i--];
}
while(j>=0){
nums1[k--]= nums2[j--];
}
この特定の問題では、nums 1 []がnums 2 []から要素を埋めるのに十分なスペースをすでに与えられているので、新しい配列を作成する必要はありません.Reference
この問題について(ソートアレイ), 我々は、より多くの情報をここで見つけました https://dev.to/insanity_xi/merge-sorted-array-63oテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol