Leetcode刷题笔记(Python 找出所有相加之和为n的k个组合,组合中只允许含有1-9的正整数,并且每种组合中不存在重复的数字。)


eg:输入:k=3,n=9

        输出: [[1,2,6],[1,3,5],[2,3,4]]

        输入:k=2,n=5

        输出:[[1,4][2,3]]

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 """
 4 # @Time : 2019/12/19 21:11 
 5 
 6 # @Author : ZFJ
 7 
 8 # @File : k个数的和为n.py 
 9 
10 # @Software: PyCharm
11 """
12 '''
13 1.初试化结果列表result=[]
14 
15 2.定义回溯函数Flash_back(num,current,tmp,next_sum)其中num表示当前已经使用的数字的数量数,current表示当前访问的数字,
16     tmp表示当前中间结果,next_sum表示下一步的目标和。
17     a.假设num==k,则说明了我们已经使用了k个数;
18     b.假设next_sum==0,则说明tmp的中间结果正好是n,那么我们就可以将tmp加入到result列表中去
19     c.需要注意我们遍历的区间是[current,10),因为只能是0-9之间的正数
20     d.现在我们需要优化,即为传说中的剪枝:
21         1)假如j>next_sum,那么就说明了接下来的数字都比目标和要大,直接break
22         2)执行回溯函数Flash_back(num+1,j+1,tmp+[j],next_sum-j)
23 3.再去执行Flash_back(0,1,[],n)
24 
25 4.返回结果列表即可
26 
27 
28 '''
29 
30 
31 class Solution(object):
32     def combinationSum3(self, k, n):
33         """
34         :type k: int
35         :type n: int
36         :rtype: List[List[int]]
37         """
38         # 1.定义结果列表
39         result = []
40 
41         # 2.定义回溯函数
42         def Flash_back(num, current, tmp, next_sum):
43             if num == k:
44                 if next_sum == 0:
45                     result.append(tmp)
46                 return
47             for j in range(current, 10):
48                 if j > next_sum:
49                     break
50                 Flash_back(num + 1, j + 1, tmp + [j], next_sum - j)
51 
52         Flash_back(0, 1, [], n)
53         return result
54 
55 
56 a = Solution()
57 b = a.combinationSum3(k=3, n=7)
58 print(b)

 

个人总结:本体因为用到了回溯法,所以在效率上显得不是很高,在思考,如何改进,欢迎大家一起交流

时间复杂度:因为从头到尾走了一遍,即为O(n!)

空间复杂度:只是借助了列表存储,所以是O(1)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



猜您在找 Leetcode练习(Python):回溯算法类:第77题:组合:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 Leetcode练习(Python):数组类:第34题:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 Leetcode练习(Python):数组类:第15题:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 Leetcode练习(Python):第387题:字符串中的第一个唯一字符:给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。 找出数组中两数之和为指定值的所有整数对 Leetcode练习(Python):哈希表类:第202题:编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为  1,那么这个数就是快乐数。 如果 n 是快乐数就返回 True ;不是,则返回 False 。 Python 中找出含有nan的所有行 Leetcode练习(Python):数组类:第59题:给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 两个大的正整数相加之和(C语言实现) Leetcode练习(Python):第258题:各位相加:给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
 
粤ICP备18138465号  © 2018-2026 CODEPRJ.COM