代码随想录Day20 | Leetcode77 组合

题目

复制代码
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

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

示例 2:
输入:n = 1, k = 1
输出:[[1]]
 

提示:
1 <= n <= 20
1 <= k <= n

思路

学到了两种非常有用的思路

代码

python 复制代码
class Solution:
    """
    给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
    你可以按 任何顺序 返回答案。

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

    示例 2:
    输入:n = 1, k = 1
    输出:[[1]]


    提示:
    1 <= n <= 20
    1 <= k <= n
    """
    def combine1(self, n, k):
        result = []
        res = []

        def dfs(i):
            """
            在[1,i]中获取d个数
            i < d:表示剩下的数量仍小于需要取的数量,可以不用递归,直接返回
            """
            d = k - len(res) # 还需要取d个数
            # if i< d:return,该条件可换为如下的[d-1, i]
            if d == 0:
                result.append(res.copy())
                return
            # 从后往前,仅取从i往前的d个数,从前往后的返回条件是:n-i+1+len(res) < k -> n-i+1 < d
            for j in range(i, d-1, -1):
                res.append(j)
                dfs(j-1)
                res.pop()
        dfs(n)
        return result

    def combine(self, n, k):
        result = []
        res = []
        def dfs(i):
            """
            在[1,i]中获取d个数
            i < d:表示剩下的数量仍小于需要取的数量,可以不用递归,直接返回
            """
            d = k - len(res) # 还需要取d个数
            # if i< d:return
            if d == 0:
                result.append(res.copy())
                return
            # 不选i,超出d的部分先不选
            if i > d:
                dfs(i-1)
            # 选i
            res.append(i)
            dfs(i-1)
            res.pop()
        dfs(n)
        return result


if __name__ == '__main__':
    test = Solution()
    n = [4, 1]
    k = [2, 1]
    for i in range(len(n)):
        print(test.combine(n[i], k[i]))
        print(test.combine1(n[i], k[i]))

总结

时常感叹,别人为什么这么厉害

相关推荐
玄同7653 分钟前
MermaidTrace库:让Python运行时“自己画出”时序图
开发语言·人工智能·python·可视化·数据可视化·日志·异常
开开心心就好6 分钟前
视频伪装软件,.vsec格式批量伪装播放专用
java·linux·开发语言·网络·python·电脑·php
weixin_BYSJ198717 分钟前
django农作物批发交易系统--附源码24008
java·javascript·spring boot·python·django·flask·php
Edward-tan18 分钟前
【玩转全栈】----Django模板语法、请求与响应
后端·python·django
Three~stone19 分钟前
Matlab R2024b 保姆级安装教程(附:解决win10问题)
开发语言·算法·matlab
硕博计算机毕设指导22 分钟前
【大数据毕设全套源码+文档】Django基于大数据技术的智慧居家养老服务平的设计与实现(丰富项目+远程调试+讲解+定制)
大数据·python·信息可视化·django·毕业设计·课程设计
ytttr87322 分钟前
基于MATLAB的一维对流扩散方程数值求解
开发语言·算法·matlab
B站计算机毕业设计超人22 分钟前
计算机毕业设计Python+Django考研院校推荐系统 考研分数线预测系统 大数据毕业设计 (代码+LW文档+PPT+讲解视频)
大数据·人工智能·hive·python·django·毕业设计·课程设计
补三补四23 分钟前
Django与模板
数据库·python·django·sqlite
程序辅导开发24 分钟前
django体育用品数据分析系统 毕业设计---附源码28946
数据库·vue.js·python·mysql·django·sqlite