有序数组合并

算法题其实不要慌就行了,就是太久没做了。

 

题:有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)

 

转载于:https://www.cnblogs.com/lurenjia1994/p/10575598.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值