【Lintcode】合併排序陣列&& 合併排序陣列 II
阿新 • • 發佈:2019-01-06
題目描述:合併兩個排序的整數陣列A和B變成一個新的陣列。
注意事項
你可以假設A具有足夠的空間(A陣列的大小大於或等於m+n)去新增B中的元素。
樣例:給出 A = [1, 2, 3, empty, empty], B = [4, 5]
合併之後 A 將變成 [1,2,3,4,5]
思路:既然是合併有序的陣列,那麼我們肯定想到一個一個去比較,如果A的第一個數大於B的第一個數,就將A整體向後移動,然後將B的第一個數插入;如果A的第一個數小於B,那麼就將A向後移動,看A第二個數和B第一個數的比較,以此類推。這種思路去實現的時候很容易出現問題,比如牽扯到拷貝的問題,比如可能會產生判斷問題。
還有種思想就是既然它已經是有序的,我們可以從後向前進行比較,如果最後A最後一個都比B第一個小,那麼就不需要移動A,直接將B插入到A的後面,如果A的最後一個比B大,那麼它也比B中其他元素大,所以將它移動到最後,接著再去比較A的倒數第二個和B倒數第一個的大小。
到這裡其實思路已經很明顯了,在寫程式碼之前,我們可以先將可能出現的測試用例寫出來,比如:
A={9,10,11,12,13},B={4,5,6,7}
A={},B={1,2,3,4}
A={1,2,3},B={}
A={1,2,3},B={4,5,6}
所以程式碼如下:
void mergeSortedArray(int A[], int m, int B[], int n) {
// write your code here
int pos=m+n-1;
int i=m-1;
int j=n-1;
while(i>=0 && j>=0)
{
if(A[i]>B[j])
{
A[pos--]=A[i--];
}
else
{
A[pos --]=B[j--];
}
}
while(j>=0)
{
A[pos--]=B[j--];
}
}
緊接著,我們對這個面試題升級。
題目描述:合併兩個排序的整數陣列A和B變成一個新的陣列。
樣例
給出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]
思路:對這個題而言,既然是返回一個新的陣列,那我們從頭開始比較然後插入到新陣列中。當其中一個數組已經插入完,那麼另外一個數組可直接插入到新陣列的後面。程式碼如下:
vector<int> mergeSortedArray(vector<int> &A, vector<int> &B) {
// write your code here
vector<int> res;
int s1=A.size();
int s2=B.size();
if(s1==0) return B;
if(s2==0) return A;
int i=0;
int j=0;
while(s1&&s2)
{
if(A[i]>B[j])
{
res.push_back(B[j]);
j++;
s2--;
}
else
{
res.push_back(A[i]);
i++;
s1--;
}
}
if(s2==0)
{
while(s1)
{
res.push_back(A[i]);
i++;
s1--;
}
}
if(s1==0)
{
while(s2)
{
res.push_back(B[j]);
j++;
s2--;
}
}
return res;
}