合並排序數組


合並兩個排序的整數數組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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM