Leetcode 77 组合

题意理解

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

        如:n=3,k=2,则有:12 13 23

        一般,我们使用回溯法来解决组合问题

        组合问题没有顺序要求,所以 12 21 是同一个组合(如果是排列12 21 是两种排列)

       一般我们可以把回溯法要解决的问题抽象成树结构

                集合大小=树的宽度=n        组合大小=递归深度=k

        所以

                我们可以将这个问题抽象为树问题,在递归方法中使用回溯来暴力搜索。

        

        由于回溯是暴力解锁的方式,为了实现性能优化,我们提前对于一些不可能搜到正确结果的树枝进行剪枝操作

1.暴力解锁的回溯

注意

        removeLast()是LinkedList的方法,List<>  list=new LinkedListM<>()是调用不到的。

        添加结果是,path的内容要复制给一个新的对象new LinkedList<>(),否则对同一个path对象修改的话,results记录的结果值也会发生改变,最终的结果就是result里面重复加入相同的path对象。。

/*** 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合* @param n* @param k* @return*/List<List<Integer>> results=new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> combine(int n, int k) {backtracking(n,k,1);return results;}public void backtracking(int n,int k,int startIndex){//结果收集,结束if(path.size()==k){//重新new一个是因为如果对同一个path操作,最终result是一堆相同的pathresults.add(new ArrayList<>(path));return;}//未收集结果,遍历当前分支子孩子for(int i=startIndex;i<=n;i++){path.add(i);backtracking(n,k,i+1);path.removeLast();}}

2.采用剪枝的回溯

采用剪枝是为了在进行暴力的回溯搜索时,及时剪除不可能搜到正确结果的树枝,对整体搜索过程进行优化。

图摘自《代码随想录》

【剪枝优化】
从startIndex收集path
n-pathSize=还需要收集的数据量
n-statIndex=剩余的数据量
如果 k-pathSize<n-startIndex+1,则剩余的搜索,现有数据不足以搜到大小为k的组合
所以我们要保证k-pathSize<n-startIndex+1,变形得  startIndex<n-(k-pathSize)+1
       /*** 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合* @param n* @param k* @return*/List<List<Integer>> results=new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> combine(int n, int k) {backtracking(n,k,1);return results;}public void backtracking(int n,int k,int startIndex){//结果收集,结束if(path.size()==k){//重新new一个是因为如果对同一个path操作,最终result是一堆相同的pathresults.add(new ArrayList<>(path));return;}//未收集结果,遍历当前分支子孩子//【剪枝优化】for(int i=startIndex;i<=n-(k-path.size())+1;i++){path.add(i);backtracking(n,k,i+1);path.removeLast();}}

3.分析

时间复杂度:

        暴力回溯:O(2^n)

        剪枝回溯:O(\binom{n}{k}\times k)

空间复杂度:

        暴力回溯:O(k)

        简直回溯:O(k)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/200685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux知识点汇总】01 Linux常见版本

常见的Linux发行版&#xff08;Distribution&#xff0c;简称为distro&#xff09;有很多&#xff0c;它们在用途、包管理系统、默认桌面环境等方面可能有所不同 CentOS 特点&#xff1a; 企业级稳定性&#xff0c;是Red Hat Enterprise Linux&#xff08;RHEL&#xff09;的开…

黑苹果配置清单

手里的MacBookPro已经快沦为电子垃圾了&#xff0c;平时用MacOS比较多&#xff0c;Window用的比较少&#xff0c;而苹果电脑的价格不管是MacBookPro还是MacMini丐版的便宜但是面对现在Window动不动就64g内存的情况就显得微不足道了&#xff0c;高配的价格直接把我劝退&#xff…

PostgreSql HOT 技术

摘自唐成的《PostgreSQL修炼之道&#xff1a;从小工到专家&#xff08;第2版&#xff09;》。 一、概述 因为多版本的原因&#xff0c;当 PostgreSQL 中更新一行时&#xff0c;实际上原数据行并不会被删除&#xff0c;只是插入了一个新行。如果表上有索引&#xff0c;而更新的…

Leetcode题库(数据库合集)_ 难度:中等

目录 难度&#xff1a;中等1.股票的资本损益2. 当选者3. 页面推荐4. 2016年的投资5. 买下所有产品的人6. 电影评分6. 确认率7. 按分类统计薪水8. 餐馆营业额的变化增长8. 即时食物配送 ①9. 至少有5名直系下属的经理10. 游戏玩法分析11. 好友申请&#xff1a;谁有最多的好友12.…

Oracle官网 账号及密码 -- 笔记

亲测有效: 账户&#xff1a;3028064308qq.com 密码&#xff1a;OraclePassword123! 引用: Oracle官网 账号及密码_oracle账号-CSDN博客 如有失效,请帮忙留言,及时删除!

Qlik 成为网络犯罪的焦点

研究人员警告说&#xff0c;Cactus 勒索软件组织正在利用 Qlik Sense 数据可视化、探索和监控解决方案中的关键漏洞来获得对企业网络的初始访问权限。 今年八月下旬&#xff0c;Qlik Sense 开发人员 针对影响 Windows 版本平台的两个关键漏洞发布了补丁 。 其中一个漏洞 CVE-…

图数据库知识点9 | 大数据框架与图数据架构异同

开门见山&#xff0c;直奔主题&#xff0c;接续前面的知识点&#xff1a; 【图数据库知识点1|图数据库与关系型数据库的区别&#xff1f;】 【图数据库知识点2 | 图思维方式】 【图数据库知识点3 | 图数据库解决了什么问题&#xff1f;】 【图数据库知识点4 | 图计算与图数…

基于Echarts的大数据可视化模板:智慧交通管理

目录 引言智慧交通管理的重要性ECharts在智慧交通中的作用智慧交通管理系统架构系统总体架构数据收集与处理Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满足管理的特定需求模板功能与特性深入解析模板提供的各项功能模板…

javaScript(二):javaScript基础语法

文章目录 1、javaScript变量定义2、JavaScript五种数据类型3、JavaScript常用运算符3.1、算术运算符3.2、赋值运算符3.3、比较运算符3.4、逻辑运算符 1、javaScript变量定义 定义变量 ES5定义变量 var 变量名 变量值;ES6定义变量 let 变量名 变量值; const 常量名 常量值;…

java面试题4

1.什么是Java中的多态性&#xff08;polymorphism&#xff09;&#xff1f; 答案&#xff1a;多态性是指同一个方法调用可以在不同的对象上产生不同的行为。它可以通过方法重写和方法重载来实现。 2.Java中的异常处理机制是什么&#xff1f; 答案&#xff1a;Java中的异常处理…

uniapp实现微信小程序pc端需求:双击表格行跳转详情,编辑完返回,表格滚动定位到之前选择的表格行

需求&#xff1a;实现双击表格行跳转详情编辑页面&#xff0c;编辑完返回时定位到之前选择的表格行 1.修改了uniapp官方组件库uni-table中的uni-tr的源码&#xff0c;添加click事件&#xff0c;添加<slot name"scroll"></slot>插槽 <block><sl…

【Linux知识点汇总】02 软件包管理器YUM与RPM到底用哪个?

RPM&#xff08;Red Hat Package Manager&#xff09; RPM是一种在基于Red Hat的Linux发行版&#xff08;如Red Hat Enterprise Linux&#xff08;RHEL&#xff09;&#xff0c;CentOS&#xff0c;Fedora等&#xff09;中使用的软件包管理系统&#xff0c;旨在简化在系统上安装…

2023美图创造力大会开幕,美图发布AI视觉大模型4.0

12月5-6日&#xff0c;主题为“未来AI设计”的美图创造力大会&#xff08;Meitu Creativity Conference&#xff0c;简称MCC&#xff09;在厦门举行。 本届大会由美图公司与站酷联合举办&#xff0c;聚焦于设计师生态和AI设计趋势。大会现场发布《2023年度AI设计实践报告》&am…

JSON 语法详解:轻松掌握数据结构(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息

文章目录 摘要1. 查询CPU使用率命令&#xff1a;top -bn1 | grep \"Cpu(s)\" | awk {split($0,arr,\" \");print 100-arr[8]}2. 查询内存命令&#xff08;单位&#xff1a;G&#xff09;&#xff1a;top -bn1 | grep \"KiB Mem\" | awk {split($…

学生档案管理系统设计

摘要 随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对学生档案信息进行管理,具有着手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量…

CoreDNS实战(四)-编译安装External Plugins

1 External Plugins概述 coredns官方对于插件的分类基本可以分为三种&#xff1a;Plugins、External Plugins和其他。其中Plugins一般都会被默认编译到coredns的预编译版本中&#xff0c;而External Plugins则不会。官方的文档对外部插件的定义有着明确的解释&#xff0c;主要…

使用 javascript 模拟 git diff 命令实现文本文件差异比较

diff.html&#xff1a; <!DOCTYPE html> <html> <head><title>文件比较</title><meta charset"UTF-8"> </head> <body> <h1>文件比较</h1> <form><label for"file1">版本1&…

第十五届蓝桥杯模拟赛B组(第二期)C++

前言&#xff1a; 第一次做蓝桥模拟赛的博客记录&#xff0c;可能有很多不足的地方&#xff0c;现在将第十五届蓝桥杯模拟赛B组&#xff08;第二期&#xff09;的题目与代码与大家进行分享&#xff0c;我是用C做的&#xff0c;有好几道算法题当时自己做的也是一脸懵&#xff0c…

一键抠图1:Python实现人像抠图 (Portrait Matting)

一键抠图1&#xff1a;Python实现人像抠图 (Portrait Matting) 目录 一键抠图1&#xff1a;Python实现人像抠图 (Portrait Matting) 1. 项目介绍 2. 抠图算法 3. Matting数据集 4. MODNet模型 (1) 项目安装 (2) 数据集说明 (3) MODNet模型 5. Demo测试效果 6. 源码下载…