有序数组合并
算法題其實(shí)不要慌就行了,就是太久沒做了。
?
題:有3個(gè)數(shù)組從小到大,寫一段代碼合并成一個(gè)數(shù)組,并保證順序
?
大致思路:
1. 拆成兩個(gè)數(shù)組合并2. 構(gòu)造一個(gè)新數(shù)組,為的是不影響原數(shù)組,而且修改數(shù)組比插入數(shù)字消耗少3. 因?yàn)樵磾?shù)組本身有序,所以可根據(jù)順序,減少運(yùn)算次數(shù)4. 結(jié)果數(shù)組弄個(gè)游標(biāo),初始為0,記錄操作位置,從兩個(gè)數(shù)組取出值比較,小的數(shù)加入到結(jié)果數(shù)組,再從小的數(shù)這個(gè)數(shù)組再取數(shù)比較,直到大于另外一個(gè)數(shù)組的數(shù),時(shí)間復(fù)雜度為O(n)?
?
代碼:
# encoding='utf8'def list_merge(list_a, list_b):'''返回兩個(gè)數(shù)組合并的結(jié)果'''len_a = len(list_a)len_b = len(list_b)result = [None for i in range(len_a + len_b)] # 構(gòu)造返回?cái)?shù)組cursor_r = -1 # result游標(biāo)cursor_b = 0 # list_b游標(biāo)# 依次從數(shù)組的最前面取出最小的數(shù),更新到結(jié)果數(shù)組for item_a in list_a:for idx in range(cursor_b, len_b):cursor_r += 1 # 移動(dòng)游標(biāo)item_b = list_b[idx]if item_a > item_b:result[cursor_r] = item_bcursor_b += 1 # 移動(dòng)list_b的游標(biāo)else:result[cursor_r] = item_a # 因?yàn)閘ist_a是for循環(huán)遍歷,所以不需要游標(biāo)break # 繼續(xù)從list_a取數(shù)# 因?yàn)槭遣捎脙蓛杀容^,放入最小的數(shù),所以會(huì)導(dǎo)致丟失最大的數(shù),這里加入最大數(shù)last = max(a[-1], b[-1])result[-1] = lastreturn resultif __name__ == '__main__':a = [1, 2, 3, 4, 5]b = [2, 3, 4, 6]c = list_merge(a, b)print(a,b)print(c)?
轉(zhuǎn)載于:https://www.cnblogs.com/lurenjia1994/p/10575598.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: 对于python 3.x与python2
- 下一篇: pythonweb框架Flask学习笔记