又是新的一周
这一周得把《Python深度学习》的剩余章节给看完了
给师兄找的文章也得找齐全了
视频打卡日记得坚持做
英语单词,阅读和日记也得坚持做
好好学习,天天向上!
77-组合
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
思路:
这一题 其实和昨天写的一个题目特别相似,即第78题子集。题目链接如下:
https://blog.csdn.net/weixin_36431280/article/details/88086945
看完这篇文章之后,你会发现这两题都是可以用两种方法解决的。第一种方法就是属于python的作弊法了,第二种方法是使用回溯法解决的。下面我将分别介绍这两种方法。
方法一:
作弊法很简单,只需要用itertools.combinations()函数即可解决问题。效率也是奇快。
代码如下:
import itertools
class Solution(object):
# 本方法属于python的作弊方法,只需要用itertools.combinations()函数即可解决问题
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
combine = itertools.combinations(range(1, n+1), k)
all_combine = []
for index in combine:
all_combine.append(list(index))
return all_combine
if __name__ == "__main__":
n = 4
k = 2
all_combine = Solution().combine(n, k)
print(all_combine)
执行效率达到了100%
方法二:
使用特别经典的回溯法来解决,对回溯法不熟悉的读者可以看看我之前写的一篇关于回溯法求解的文章,里面我对如何求解此类题目有了很详细的结束。
https://blog.csdn.net/weixin_36431280/article/details/84891567
由于此题使用回溯法求解的步骤特别短,所以此处我就不详细的介绍步骤了,直接贴代码吧,一看就懂。
代码如下:
class Solution(object):
# 本题亦可使用回溯法解决问题
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
# 定义保存最终结果的集合
combine_list = []
def back(start=1, single_list=[]):
if len(single_list) == k:
combine_list.append(single_list[:])
return True
for index in range(start, n+1):
back(index+1, single_list+[index])
back()
return combine_list
if __name__ == "__main__":
n = 4
k = 2
all_combine = Solution().combine(n, k)
print(all_combine)
不过执行效率有些差,只有10%左右。如果有更好思路的朋友还请积极留言啊!!!