1. 程式人生 > >合併排序陣列(LintCode)

合併排序陣列(LintCode)

題目來源:LintCode

原題地址:http://www.lintcode.com/zh-cn/problem/merge-sorted-array-ii/
題目:

合併兩個排序的整數陣列A和B變成一個新的陣列。

您在真實的面試中是否遇到過這個題? Yes 樣例

給出A=[1,2,3,4]B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]

挑戰

你能否優化你的演算法,如果其中一個數組很大而另一個數組很小?


難度級別:
容易
思路分析:
       我採用的比較常規的思路,用的就是歸併排序的方法。
首先開闢一個新的空間,其大小是兩個陣列的總和,來存放合併排序之後的陣列。
然後就是歸併的常規思路了。
     對於挑戰的意思,我的理解是否是要想辦法來降低所需的額外空間呢? 還是要更快的進行合併排序呢?
     如果是降低所需的額外空間的話,那麼如果陣列是一大一小,且大的陣列是能夠容納所有的元素的話。
那麼,我們可以從陣列的末尾開始從遍歷,進行歸併操作。當較小的陣列元素全部歸併結束之後,成像就可以停止歸併了。

實現程式碼:
class Solution
{
public:
    /**
    * @param A and B: sorted integer array A and B.
    * @return: A new sorted integer array
    */
    vector<int> mergeSortedArray(vector<int> &A, vector<int> &B)
    {
        vector<int> result(A.size()+B.size(), 0);
        int i = 0, j = 0;
        int k = 0;
        while (i < A.size() && j < B.size())
        {
            if (A[i] > B[j])
            {
                result[k++] = B[j++];
            } else
            {
                result[k++] = A[i++];
            }
        }
        while (i < A.size())
        {
            result[k++] = A[i++];
        }
        while (j < B.size())
        {
            result[k++] = B[j++];
        }
        return result;
    }
};


程式碼說明:
上述程式碼採用的常規的思路,因為題中並未保證原陣列的大小。