有序數組合並

算法題其實不要慌就好了,就是過久沒作了。算法

 

題:有3個數組從小到大,寫一段代碼合併成一個數組,並保證順序

 

大體思路:

1. 拆成兩個數組合並

2. 構造一個新數組,爲的是不影響原數組,並且修改數組比插入數字消耗少

3. 由於源數組自己有序,因此可根據順序,減小運算次數

4. 結果數組弄個遊標,初始爲0,記錄操做位置,從兩個數組取出值比較,小的數加入到結果數組,再從小的數這個數組再取數比較,直到大於另一個數組的數,時間複雜度爲O(n)

 

 

代碼:

# encoding='utf8'


def list_merge(list_a, list_b):
    '''返回兩個數組合並的結果'''

    len_a = len(list_a)
    len_b = len(list_b)
    result = [None for i in range(len_a + len_b)]   # 構造返回數組
    cursor_r = -1       # result遊標
    cursor_b = 0        # list_b遊標

    # 依次從數組的最前面取出最小的數,更新到結果數組
    for item_a in list_a:
        for idx in range(cursor_b, len_b):
            cursor_r += 1       # 移動遊標
            item_b = list_b[idx]
            if item_a > item_b:
                result[cursor_r] = item_b
                cursor_b += 1   # 移動list_b的遊標
            else:
                result[cursor_r] = item_a   # 由於list_a是for循環遍歷,因此不須要遊標
                break   # 繼續從list_a取數

    # 由於是採用兩兩比較,放入最小的數,因此會致使丟失最大的數,這裏加入最大數
    last = max(a[-1], b[-1])
    result[-1] = last
    return result

if __name__ == '__main__':
    a = [1, 2, 3, 4, 5]
    b = [2, 3, 4, 6]
    c = list_merge(a, b)
    print(a,b)
    print(c)
相關文章
相關標籤/搜索