合並兩個排序的整數數組A和B變成一個新的數組。
給出A = [1, 2, 3, empty, empty] B = [4,5],
合並之后A將變成[1,2,3,4,5]。
其中,假設數組A有足夠大的空間,也就是說,如果A的非空元素個數為m,B的非空元素個數為n,那么A的空間容量一定是大於等於m+n的
1 <?php 2 /** 3 * 合並兩個排序的整數數組A和B變成一個新的數組(A具有足夠的空間(A數組的大小大於或等於m+n)去添加B中的元素) 4 * A = [1, 2, 3, empty, empty], B = [4, 5] 5 * 合並之后A將變成[1, 2, 3, 4, 5] 6 */ 7 8 /** 9 * A = [1, 2, 3, empty, empty] 10 * B = [4, 5] 11 * m = 3 12 * n = 2 13 * m+n-1=4 14 * 所以從A[4]這個位置,向前開始賦值 15 * a.比較A[2]=3和B[1],因為A[2]<B[1],所以A[4]=B[1]=5 16 * b.比較B[0]和A[2],大者賦值給A[3] 17 * c.按照這個規則持續掃描,直到有一個掃描完為止 18 * 19 * 其中一個掃描完了,怎么辦? 20 * 如果A先掃描完,可以想象,情況是這樣:假如A = [4, 5, 6, empty, empty]; B = [1, 2] 則最終會變成A = [4, 5, 4, 5, 6],所以需要將B剩余部分[1, 2]分別賦值給A的還沒賦值的部分 21 * 如果B先掃描完,則不需要作任何操作(A前面也是排好序的) 22 */ 23 function solution($a, $b) 24 { 25 //默認$a,$b均不為空,不作參數校驗 26 $size = count($a) - 1;//數組$a的尾下標 27 $n = count($b) - 1; 28 $m = $size - $n - 1; 29 30 while($n>=0 && $m>=0) { 31 if($a[$m] < $b[$n]) { 32 $a[$size] = $b[$n]; 33 $n--; 34 } else { 35 $a[$size] = $a[$m]; 36 $m--; 37 } 38 $size--; 39 } 40 41 //假如$b先循環完,沒有問題;但是如果$a先循環完,則會出現問題; 42 //例:A = [4, 5, 6, empty, empty]; B = [1, 2] 則最終會變成A = [4, 5, 4, 5, 6] 43 while($n>=0) { 44 $a[$n] = $b[$n]; 45 $n--; 46 } 47 return $a; 48 } 49 50 $a = [1, 2, 3, 0, 0];//0代表空 51 $b = [4, 5]; 52 $res = solution($a, $b); 53 echo "<pre>"; 54 print_r($res); 55 56 $a = [4, 5, 6, 0, 0];//0代表空 57 $b = [1, 2]; 58 $res = solution($a, $b); 59 echo "<pre>"; 60 print_r($res);
