輸入 k = 2 ,n = 4
輸出 12 13 14 23 24 34 組合
# n = input("請輸入n值:") n = 4
# k = input("請輸入k值: ") k = 2
n =20
k =16
nums =
[i for i in
range(1
, n +1)
]res =
# print(nums)
defbacktrace
(nums_b, curr_res, index):if
len(curr_res)
== k::]
)#print(res)
return
for i in
range
(index, n):)
backtrace(nums_b[index:
], curr_res, i +1)
curr_res.pop(
)if n ==
0or k ==0:
return res
backtrace(nums,
,0)print
(res[:]
)
(1)回溯法
(2)python的深拷貝與淺拷貝
具體如下:
python中列表和陣列的賦值,淺拷貝和深拷貝
列表賦值:
>>> a = [1, 2, 3]
>>> b = a
>>> print b
[1, 2, 3]
>>> a[0] = 0
>>> print b
[0, 2, 3]
解釋:[1, 2, 3]被視作乙個物件,a,b均為這個物件的引用,因此,改變a[0],b也隨之改變
如果希望b不改變,可以用到切片
>>> b = a[:]
>>> a[0] = 0
>>> print b
[1, 2, 3]
解釋,切片a[:]會產生乙個新的物件,占用一塊新的記憶體,b指向這個新的記憶體區域,因此改變a所指向的物件的值,不會影響b
列表深拷貝和淺拷貝
淺拷貝
>>> import copy
>>> a = [1, 2, 3, [5, 6]]
>>> b = copy.copy(a)
>>> print b
[1, 2, 3, [5, 6]]
>>> print b
[1, 2, 3, [5, 6, 'c']]
深拷貝
>>> a = [1, 2, 3, [5, 6]]
>>> b = copy.deepcopy(a)
>>> print b
[1, 2, 3, [5, 6]]
拷貝即是開闢一塊新的記憶體空間,把被拷貝物件中的值複製過去。而淺拷貝並沒有為子物件[5,6]開闢一塊新的記憶體空間,而僅僅是實現對a中[5,6]的引用。所以改變a中[5,6]的值,b中的值也會發生變化。
深拷貝則是為子物件也開闢了一塊新空間。所以改變a中[5, 6]的值,並不影響b
陣列賦值不能用切片來達到相同的目的
>>> import numpy as np
>>> a = np.array([1, 2 ,3])
>>> b = a[:]
>>> a[0] = 5
>>> print a, b
[5 2 3] [5 2 3]
如上,雖然用切片,但不能達到修改a而不影響b的目的。說明a,b仍然指向同一塊記憶體。
此時,只能用拷貝
>>> b = a.copy()
>>> a[0] = 5
>>> print a, b
[5 2 3] [1 2 3]
此時修改a不會影響到b。其中的原因以後進一步深究。
注意,列表的拷貝是copy.copy(obj)或copy.deepcopy(obj),陣列的拷貝是obj.copy()
深拷貝和淺拷貝**:
資料結構演算法刷題(學習筆記二)
1.演算法時間複雜度 2.函式呼叫的時間複雜度分析 3.演算法的空間複雜度 4.線性表 給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取 輸入 can...
資料結構和演算法 刷題 雜湊演算法
nums1 1,2,2,1 nums2 2,2 返回 2,2 雜湊是一種查詢演算法 from collections import counter from collections import defaultdict 不存在的key時 返回預設值 from collections import o...
演算法與資料結構 刷題日記
各種排序時間 空間複雜度 穩定性總結 一般把快排的空間複雜度看作o l ogn o logn o logn n個頂點的無向圖的鄰接矩陣有n個表頭節點,每個節點擊作乙個表頭,即可建立鄰接表。二叉排序樹 binary sort tree 或者是一棵空樹 或者是具有下列性質的二叉樹 憨憨題 若二叉樹用二叉...