2021.11.19-leetcode 46
排列问题,利用回溯算法。
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = []
def huisu(tmp,list1):
if len(tmp)==len(nums):
res.append(tmp)
for i, val in enumerate(list1):
if not list1:
break
huisu(tmp+[val],list1[:i]+list1[i+1:]) # 为什么不用 remove
huisu([],nums)
return res
关键是 选择列表如何更新。
问题:为什么用 remove 跑不通。
方法二:
在原数组 nums 上做改动。
res = []
def backtrack(stay_number):
if stay_number == len(nums):
res.append(nums[:])
for i in range(stay_number, len(nums)):
# 同时操作可以做到交换元素位置
# 等价于 p = a, a = b, b = p
# 动态维护数组
nums[stay_number], nums[i] = nums[i], nums[stay_number]
backtrack(stay_number+1)
# 撤销维护,再次交换顺序
nums[stay_number], nums[i] = nums[i], nums[stay_number]
backtrack(0)
return res
同时操作可以做到交换元素位置
nums[stay_number], nums[i] = nums[i], nums[stay_number]
list[ : ] 创建原始列表的副本。但它不引用同一个列表对象。因此,更改li[:]创建的副本不会有更改原始列表的风险。
例如:
list1 = [1,2,3]
list2 = list1
list3 = list1[:]
list1[0] = 4
list2
[4, 2, 3]list3
[1, 2, 3]
这里通过改变list1来改变list2,但是list3不会改变。