Leetcode 40 组合总和 II

题意理解:

  1.         每个数字在每个组合中只能使用 一次 
  2.         数字可以重复——>难点(如何去重)
  3.         每个组合和=target

        求组合,对合限制,考虑回溯的方法。——将其抽象为树结构。

        树的宽度——分支大小

        树的深度——最长的组合(和=target)

  去重难点:

        根据《代码随想录》关于树层去重的引入:

        第一个位置选2,再次选2的话,下面的分支回出现重复的[2,3]组合。

        实际上保留第一个分支,之后同一位置相同的数值选项可以剪除。

        用used[]数组来维护是否被访问的状态。

        

回溯的方法:

        1.确定返回值+参数列表

        2.确定终止条件|剪枝条件

        3.单层逻辑|回溯操作

1.暴力回溯+剪枝优化

考虑返回值一般为void, 参数包含数组,和目标值,当前数值指示下标

终止条件: sum>=4,特别的sum==4时收集结果。

单层递归逻辑:一定要对sum和path、used数组做好回溯操作。

数层剪枝:candidates[i-1]==candidates[i]遇到重复值

        used[i-1]=true:表示上一个重复的值,在该组合内被用到。

        used[i - 1] == false:表示上一个重复值在该组合内没有用到,应该是同一树层用到——即数层重复,剪枝。

List<List<Integer>> result=new ArrayList<>();LinkedList<Integer> path=new LinkedList<>();int sum=0;public List<List<Integer>> combinationSum2(int[] candidates, int target) {boolean[] used=new boolean[candidates.length];Arrays.sort(candidates);Arrays.fill(used, false);backtrackig(candidates,target,0,used);return result;}public void backtrackig(int[] candidates, int target,int startIndex,boolean[] used){//终止|剪枝if(sum>target) return;else if (sum==target) {result.add(new ArrayList<>(path));return;}//单层递归逻辑for(int i=startIndex;i<candidates.length;i++){//数层剪枝if(i!=0&&candidates[i-1]==candidates[i]&&used[i-1]==false) continue;path.add(candidates[i]);sum+=candidates[i];used[i]=true;backtrackig(candidates,target,i+1,used);path.removeLast();sum-=candidates[i];used[i]=false;}}

注意两个特殊的地方:

Arrays.sort(candidates);//数组排序

Arrays.fill(used, false);//数组填充,实际上该数组默认也是false.

2.分析

时间复杂度:O(2^{n} \times n)

空间复杂度:O(n)

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

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

相关文章

.NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)

WebAppDbTest 项目准备 项目准备1、.net cli 创建项目2、nuget 包引用和项目结构2.1、项目添加相关 nuget 包2.2、WebAppDbTest 项目结构 3、项目代码说明3.1、CSharp/C# 类文件说明3.2、json 配置文件说明 4、项目运行预览 数据库 .db 文件准备1、创建 SQLite 数据库1.1、在 W…

vue前端访问Django channels WebSocket失败

现象 前端报错&#xff1a;SSH.vue:51 WebSocket connection to ‘ws://127.0.0.1:8000/server/terminal/120.59.88.26/22/1/’ failed: 后端报错&#xff1a;Not Found: /server/terminal/120.79.83.26/22/1/ 原因 django的版本与channels的版本不匹配&#xff08;django…

IDEA多模块开发-加载模块管理-加快项目加载速度

加快项目加载速度 当一个项目模块数量多起来之后&#xff0c;若所有的模块都同时使用git&#xff0c;maven管控&#xff0c;那么每次Idea打开项目/git切换分支加载时间将会极久 配置git模块 file-setting- Version-Control 管理git控制模块&#xff0c; 对于当前不需要git管…

【Maven教程】(十二):版本管理 ——版本号定义约定及相关概念,自动化版本发布与创建分支,GPG签名 ~

Maven 版本管理 1️⃣ 版本管理的概念2️⃣ Maven 的版本号定义约定3️⃣ 主干、标签与分支4️⃣ 自动化版本发布5️⃣ 自动化创建分支6️⃣ GPG签名6.1 GPG 及其基本使用6.2 Maven GPG Plugin &#x1f33e; 总结 一个健康的项目通常有一个长期、合理的版本演变过程。例如JUn…

分布式之raft一致性算法

1.CAP定理 在一个分布式系统中&#xff0c;CAP三者不可兼得&#xff0c;最多只有两者可以满足&#xff0c;正所谓鱼和熊掌不可兼得 一致性 Consistency&#xff1a;所有的节点在同一时间的数据一致可用性 Availability&#xff1a;服务在正常响应时间内可用分区容错性 Partit…

全新wifi大师独立版4.0.5分销小程序/专业独立版/带流量主+搭建教程

源码简介&#xff1a; 全新wifi大师独立版4.0.5分销小程序&#xff0c;它是专业独立版&#xff0c;而且是带流量主&#xff0c;有搭建教程。 WiFi大师是一款专为商家店内用户设计的WiFi连接小程序。它的出现有效解决了商家在为客户提供WiFi服务的过程中遇到的各种问题&#x…

大数据篇|Hadoop发展史及介绍

文章目录 一、Hadoop介绍1.1、Hadoop是什么 二、Hadoop发展史2.1、创始人2.2、Hadoop发展历史/起源2.3、Hadoop三大发行版本2.3.1、Apache Hadoop2.3.2、Cloudera Hadoop2.3.3、Hortonworks Hadoop 三、Hadoop组成3.1、Hadoop组成3.2、模块3.3、Hadoop特性优点 一、Hadoop介绍 …

ppt编辑密码如何设置?

大家在PPT中设置了限制编辑&#xff0c;发现后面任然可以编辑文件。那么如何将PPT文件设置成禁止修改模式呢&#xff1f;今天分享几个方法给大家。 方法一 将PPT文件直接保存或者另存为一份文件&#xff0c;在保存时&#xff0c;将文件格式选择为PowerPoint图片演示文稿 方法…

关于uniapp X 的最新消息

uni-app x 是什么&#xff1f; uni-app x&#xff0c;是下一代 uni-app&#xff0c;是一个跨平台应用开发引擎。 uni-app x 没有使用js和webview&#xff0c;它基于 uts 语言。在App端&#xff0c;uts在iOS编译为swift、在Android编译为kotlin&#xff0c;完全达到了原生应用的…

【基于LSTM的股票数据预测与分类】

基于LSTM的股票数据预测与分类 引言数据集与爬取数据处理与可视化股票预测与分类Flask页面搭建股票推荐功能创新点结论 引言 股票市场波动剧烈&#xff0c;对于投资者而言&#xff0c;精准的数据预测和分类是制定明智决策的基础。本文将介绍一种基于长短时记忆网络&#xff08…

安装EfficientSAM过程记录

1. 可以从github或者hugging face下载测试程序 2. 最好用Hugging face中app.py进行测试&#xff0c;github中的例程EfficientSAM_example.ipynb的程序有些BUG需要自己调试&#xff0c;需要修改两处错误。 3. 主要以Hugging face进行讲解&#xff1a; 建立虚拟环境ESAM&#…

Vue H5项目,怎么引入uni.webview sdk,调用uni postMessage实现手机蓝牙连接打印功能(uniapp)

前言 目前公司Vue H5项目&#xff0c;用webview打包成APP&#xff0c;现产品提出这样打包出来的app运行较慢&#xff0c;需要用uniapp方式&#xff08;即使用HBuilder编辑器来打包H5&#xff09;来打包&#xff0c;那需要的基座就不是安卓的基座而是uniapp的基座&#xff0c;而…