Q:
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.
來(lái)解釋下題干先(這題看著特簡(jiǎn)單宠纯,其實(shí)有些小細(xì)節(jié)扣一下,發(fā)現(xiàn)點(diǎn)兒tricky):
- m和n盼忌,是有效數(shù)字奠伪。比如int[] nums1 = [1,2,3,4], m =2。那么這里我們只考慮前兩個(gè)sorted數(shù)字护戳。
- 對(duì)于測(cè)試用例 { [1,2,3,5] 2, [2,4,5,7] 4 }翎冲。這個(gè)不行,m+n超過(guò)nums1的長(zhǎng)度了媳荒。
- 雖然說(shuō)是結(jié)果不會(huì)大于m+n抗悍,但其實(shí)換個(gè)說(shuō)法,length of result不會(huì)大于m的值钳枕。
A:
這個(gè)代碼寫的比較平鋪直敘缴渊,但是不夠精簡(jiǎn):
- 如果A,B數(shù)組的index值用其它字母表示,可以原地--,少些幾行n--, m--鱼炒。
- 另外衔沼,其實(shí)沒(méi)必要再判斷一個(gè)
else if(m>0)
。比如測(cè)試用例 { [3,7,9,10] 1, [1,2,3,4] 3 } 其實(shí)第一次比較的是nums1的3和nums2里的3昔瞧,那么執(zhí)行到else if(m>0)
, 就是先把nums1里的3放到nums1[3]的位置指蚁,然后回到for loop開(kāi)始,再繼續(xù)自晰。之后凝化,m=0,for loop后續(xù)的所有操作都是執(zhí)行最后一個(gè)else if(n>0)
里的內(nèi)容酬荞。得到[1,2,3,3]搓劫。
如果把第二個(gè)else if(m>0)
刪掉瞧哟,一旦出現(xiàn)相同數(shù)字3的時(shí)候,就把nums2里的3放進(jìn)去枪向,nums1那個(gè)值(3)留著下次用勤揩,反正兩個(gè)都是sorted array,下一趟for loop遣疯,肯定是把nums1的3和nums2的3緊挨著放雄可。
還有就是如果nums2為空,for loop里的判斷全都失效了缠犀,自然是直接返回nums1的原有內(nèi)容数苫。
另外,最基礎(chǔ)的概念:
- if是判斷語(yǔ)句辨液,while是循環(huán)虐急。本質(zhì)差別。
-
if(); else if(); else if();
這樣的語(yǔ)法滔迈,只執(zhí)行其中一個(gè)止吁,都滿足的話,只執(zhí)行第一個(gè)燎悍。如果第一個(gè)不滿足敬惦,后兩個(gè)滿足,那只執(zhí)行第二個(gè)谈山。
public void merge(int A[], int m, int B[], int n) {
for(int i = m+n-1; i>=0; i--)
{
if( m>0 && n>0) //兩個(gè)數(shù)比較大小
{
if(B[n-1] > A[m-1])
{
A[i] = B[n-1];
n--;
}
else
{
A[i] = A[m-1];
m--;
}
}
else if(m>0) //當(dāng)兩個(gè)數(shù)一樣的時(shí)候
{
A[i] = A[m-1];
m--;
}
else if(n>0)
{
A[i] = B[n-1];
n--;
}
}
}
精簡(jiǎn)版本 (no AC俄删,F(xiàn)inshed all run custom testcase):
public void merge(int A[], int m, int B[], int n) {
int mi = m-1;
int ni = n-1;
for(int i = m+n-1; i>=0; i--)
{
if( mi>=0 && ni>=0) //因?yàn)樵诓僮鱥ndex值,所以要考慮 =0 的情況
{
if(B[ni] > A[mi])
{
A[i] = B[ni--];
}
else
{
A[i] = A[mi--];
}
}
else if (ni>=0) //當(dāng)兩個(gè)數(shù)一樣的時(shí)候
{
A[i] = A[ni--];
}
}
}
Submit 時(shí)的這個(gè)OJ test case 神經(jīng)病奏路,另外上面這個(gè)還有(Runtime Limited Exceeded報(bào)錯(cuò)過(guò)):
這個(gè)用的while loop畴椰,思路同上,AC鸽粉,精簡(jiǎn):
public void merge(int A[], int m, int B[], int n) {
int i=m-1;
int j=n-1;
int k = m+n-1;
while(i >=0 && j>=0)
{
if(A[i] > B[j])
A[k--] = A[i--];
else
A[k--] = B[j--];
}
while(j>=0)
A[k--] = B[j--];
}