首页 > 搜索 > 回溯算法1234,算法之回溯习题:排列组合问题

回溯算法1234,算法之回溯习题:排列组合问题

互联网 2020-10-24 13:46:11
在线算命,八字测算命理

https:////www.cnblogs.com/liushoudong/articles/12396752.html

主要有三种类型的排列问题:

1.全排列

2.下一个排列

3.第k个排列

 

LeetCode31:下一个排列

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。

1,2,3 --> 1,3,2

3,2,1 --> 1,2,3

1,1,5 --> 1,5,1

解决方案:

方法一:暴力法

找出全排列,再排序

方法二:一遍扫描

 

LeetCode77:组合

给定两个整数n和k,返回1......n中所有可能的k个数的组合。

输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]

回溯法:是一种通过遍历所有可能成员来寻找全部可行解的算法。若候选不是可行解(或者至少不是最后一个解),回溯法会在前一步进行一些修改以舍弃该候选,换而言之,回溯并再次尝试。

1 class Solution: # 根据排列组合 2 def combine(self, n: int, k: int) -> List[List[int]]: 3 nums = [i for i in range(1, n+1)] 4 res = [] 5 ress = [] 6 self.combine_helper(nums, n, k, res, ress) 7 return ress 8 def combine_helper(self, nums, n, k, res, ress): 9 if len(nums) == n-k:10 ress.append(res)11 return ress12 for i in range(len(nums)):13 x = res[:]14 x.append(nums[i])15 self.combine_helper(nums[i+1:], n-i, k, x, ress) 1 #官方题解1:回溯法 2 class Solution: 3 def combine(self, n: int, k: int) -> List[List[int]]: 4 def backtrack(first=1, cur=[]): 5 if len(cur) == k: 6 res.append(cur[:]) return 7 for i in range(first, n + 1): 8 cur.append(i) 9 backtrack(i+1, cur)10 cur.pop()11 res = []12 backtrack()13 return res

 字典序(二进制排序)组合:主要思路是以字典序的顺序获得全部组合。??

算法:将nums初始化为从1到k的整数序列。将n+1添加为末尾元素,起到“哨兵”的作用。

将指针设为列表的开头j=0

while j

免责声明:非本网注明原创的信息,皆为程序自动获取互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件12小时内删除。

相关阅读

一周热门

查看更多