代码随想录第天 78.子集 90.子集II

LeetCode 78 子集

题目描述

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

输入:nums = [0]
输出:[[],[0]]

思路

        这道题目和普通的回溯问题的区别在于,每加入一次新的元素都要将结果加入result数组中,而不是需要判断path数组中的元素是否达到题目要求的标准,才加入result数组,所以做出的改变就是,在for循环的过程中,每一次循环都需要加当前的数组加入result中。

代码实现

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,int startindex){if(path.size() == 0) result.push_back(path);if(path.size() == nums.size()){return;}for(int i = startindex;i < nums.size();i++){path.push_back(nums[i]);result.push_back(path);backtracking(nums,i + 1);path.pop_back();}return;}vector<vector<int>> subsets(vector<int>& nums) {backtracking(nums,0);return result;}
};

LeetCode 90 子集II 

题目描述

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

示例 1:

输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]

示例 2:

输入:nums = [0]
输出:[[],[0]]

思路

        子集一问题和子集二问题的区别在于子集二需要进行剪枝。而如何进行剪枝和前面的组合问题是一样的步骤。要去重的是“同一树层上的使用过”,如何判断同一树层上元素(相同的元素)是否使用过了呢。

如果nums[i] == nums[i - 1] 并且 used[i - 1] == false,就说明:前一个树枝,使用了nums[i - 1],也就是说同一树层使用过nums[i - 1]

此时for循环里就应该做continue的操作。

这块比较抽象,如图:

40.组合总和II1

可以看出在nums[i] == nums[i - 1]相同的情况下:

  • used[i - 1] == true,说明同一树枝nums[i - 1]使用过
  • used[i - 1] == false,说明同一树层nums[i - 1]使用过

used[i - 1] = false说明已经进入另一个树枝,所以前一个数才会被跳过,没有遍历到。而 used[i - 1] == true,说明是进入下一层递归,去下一个数,所以是树枝上,如图所示:

代码实现

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,int startindex,vector<bool>& used){if(path.size() == 0) result.push_back(path);if(path.size() == nums.size()) return;for(int i = startindex;i < nums.size();i++){if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false){continue;}path.push_back(nums[i]);result.push_back(path);used[i] = true;backtracking(nums,i + 1,used);path.pop_back();used[i] = false;}return;}vector<vector<int>> subsetsWithDup(vector<int>& nums) {vector<bool> used(nums.size(),false);sort(nums.begin(),nums.end());backtracking(nums,0,used);return result;}
};

 LeetCode 491 非递减子序列

题目描述

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。

数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

示例 1:

输入:nums = [4,6,7,7]
输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]

示例 2:

输入:nums = [4,4,3,2,1]
输出:[[4,4]]

思路

  • 递归函数参数

本题求子序列,很明显一个元素不能重复使用,所以需要startIndex,调整下一层递归的起始位置。

代码如下:

vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums, int startIndex)
  • 终止条件

本题其实类似求子集问题,也是要遍历树形结构找每一个节点,所以可以不加终止条件,startIndex每次都会加1,并不会无限递归。

但本题收集结果有所不同,题目要求递增子序列大小至少为2,所以代码如下:

if (path.size() > 1) {result.push_back(path);// 注意这里不要加return,因为要取树上的所有节点
}
  • 单层搜索逻辑

491. 递增子序列1

 在图中可以看出,同一父节点下的同层上使用过的元素就不能再使用了。这里避免重复的思路是使用一个unoedered set去判断某一数字在当前树层是否使用过。

那么单层搜索代码如下:

unordered_set<int> uset; // 使用set来对本层元素进行去重
for (int i = startIndex; i < nums.size(); i++) {if ((!path.empty() && nums[i] < path.back())|| uset.find(nums[i]) != uset.end()) {continue;}uset.insert(nums[i]); // 记录这个元素在本层用过了,本层后面不能再用了path.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();
}

代码实现

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,int startindex){if(path.size() > 1){result.push_back(path);}unordered_set<int> uset;for(int i = startindex;i < nums.size();i++){if((!path.empty() && nums[i] < path.back())|| uset.find(nums[i]) != uset.end()){continue;}uset.insert(nums[i]); path.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();}}vector<vector<int>> findSubsequences(vector<int>& nums) {backtracking(nums, 0);return result;}
};

 

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

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

相关文章

LeetCode 2581.统计可能的树根数目:换根DP(树形DP)

【LetMeFly】2581.统计可能的树根数目&#xff1a;换根DP(树形DP) 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-number-of-possible-root-nodes/ Alice 有一棵 n 个节点的树&#xff0c;节点编号为 0 到 n - 1 。树用一个长度为 n - 1 的二维整数数组 edges…

debian/ubuntu 编译安装nginx php

debian/ubuntu 编译安装nginx php tar -zxvf nginx-1.9.9.tar.gz apt-get install libpcre3 libpcre3-dev ./configure --prefix/work/nginx-1.9.9 --with-pcre make make install service iptables stop #关闭防火墙, 可能不需要 修改nginx运行用户为tboqi 抱着log目录可…

【通信基础知识】完整通信系统的流程图及各模块功能详解

2024.2.29 抱歉最近在写毕设大论文&#xff0c;因此没有太多时间更新。然而&#xff0c;在写论文的过程中&#xff0c;发现自己对通信系统的了解还不够全明白&#xff0c;因此差了一些硕博论文总结了一个完整的通信系统流程图。若有不对的地方请多多指正//部分内容有参考ChatGP…

【Elasticsearch管理】网络配置

文章目录 HTTP高级网络设置高级TCP设置 TransportTCP传输概要文件Transport跟踪 线程池fixed线程池fixed_auto_queue_sizescaling处理器设置 HTTP Elasticsearch只在默认情况下绑定到本地主机。对于运行本地开发服务器(如果在同一台机器上启动多个节点&#xff0c;甚至可以运行…

YOLOv7基础 | 第2种方式:简化网络结构之yolov7.yaml(由104层简化为30层)

前言:Hello大家好,我是小哥谈。通过下载YOLOv7源码可知,原始的yolov7.yaml文件是拆开写的,比较混乱,也不好理解,并且为后续改进增添了很多困难。基于此种情况,笔者就给大家介绍一种将yolov7.yaml文件简化的方法,将104层简化为30层,并且参数量和计算量和原来是一致的,…

内存占用构造方法

#使用虚拟内存构造内存消耗 mkdir /tmp/memory mount -t tmpfs -o size5G tmpfs /tmp/memory dd if/dev/zero of/tmp/memory/block #释放消耗的虚拟内存 rm -rf /tmp/memory/block umount /tmp/memory rmdir /tmp/memory #内存占用可直接在/dev/shm目录下写文件

《极客时间 - 左耳听风》【文章笔记个人思考】

《极客时间 - 左耳听风》原文链接&#xff1a;https://time.geekbang.org/column/intro/100002201?tabcatalog 10 | 如何成为一个大家愿意追随的Leader&#xff1f; 10 | 如何成为一个大家愿意追随的Leader&#xff1f; 这里的Leader是在技术上取得优势&#xff0c;而不是行政…

2024年2月个人工作生活总结

本文为 2024年2月工作生活总结。 研发编码 一些警告修正记录 这个月修正了个人所负责的工程警告&#xff0c;这些警告其实是前人的代码遗留的&#xff0c;我续写的代码&#xff0c;除printf函数的%d、%ld格式&#xff0c;都在写的过程中改了。 下面记录一些典型的警告及应对…

NLP(一)——概述

参考书: 《speech and language processing》《统计自然语言处理》 宗成庆 语言是思维的载体&#xff0c;自然语言处理相比其他信号较为特别 word2vec用到c语言 Question 预训练语言模型和其他模型的区别? 预训练模型是指在大规模数据上进行预训练的模型&#xff0c;通常…

测试环境搭建整套大数据系统(七:集群搭建kafka(2.13)+flink(1.13.6)+dinky(0.6)+iceberg)

一&#xff1a;搭建kafka。 1. 三台机器执行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下俩内容 1.三台机器分别给予各自的broker_id…

git操作学习记录,简单易上手

配置git 的账户邮箱 $ git config --global user.name "Firstname Lastname" $ git config --global user.email "your_emailexample.com"代码回溯 git rest --hard [commit哈希值]git log命令只能查看以当前状态为终点的历史日志 git reflog命令&#x…

Python+neo4j构建豆瓣电影知识图谱

文章目录 数据来源数据整理导入节点和关系导入使用Subgraph批量导入节点和关系 多标签实体和实体去重 数据来源 http://www.openkg.cn/dataset/douban-movie-kg 该网址拥有丰富的中文知识图谱数据集&#xff0c;OpenKG(Open Knowledge Graph)&#xff0c;可供研究人员使用研究…

【golang】25、图片操作

用 “github.com/fogleman/gg” 可以画线, 框 用 “github.com/disintegration/imaging” 可以变换颜色 一、渲染 1.1 框和字 import "github.com/fogleman/gg"func DrawRectangles(inPath string, cRects []ColorTextRect, fnImgNameChange FnImgNameChange) (st…

Python爬虫——Urllib库-3

目录 ajax的get请求 获取豆瓣电影第一页的数据并保存到本地 获取豆瓣电影前十页的数据 ajax的post请求 总结 ajax的get请求 获取豆瓣电影第一页的数据并保存到本地 首先可以在浏览器找到发送数据的接口 那么我们的url就可以在header中找到了 再加上UA这个header 进行请…

Facebook的元宇宙实践:数字化社交的新前景

近年来&#xff0c;元宇宙&#xff08;Metaverse&#xff09;这一概念备受瞩目&#xff0c;被认为是数字化社交的未来趋势之一。而在众多科技巨头中&#xff0c;Facebook&#xff08;现更名为Meta&#xff09;一直处于元宇宙发展的前沿。在本文中&#xff0c;我们将深入探讨Fac…

万字带你走过数据库的这激荡的三年

本文收集了卡内基梅隆大学计算机科学系数据库学副教授 Andy Pavlo 从 2021 到 2023 连续三年对数据库领域的回顾&#xff0c;希望通过连续三年的回顾让你对数据库领域的技术发展有所了解。 关于 Andy Pavlo&#xff1a;卡内基梅隆大学计算机科学系数据库学副教授&#xff0c;数…

vuepress项目侧边栏菜单配置使用

第一种菜单配置&#xff0c;自定义菜单名称 {text: 菜单名称,// 是否折叠collapsible: true,children: [{text: "自定义md菜单名称",sidebarDepth: 2,link: "/xxx/aa.md",children: [],}],},第二种菜单配置 标题自动生成菜单&#xff0c;使用需要搭配sideb…

c语言求矩阵的局部极大值

给定M行N列的整数矩阵A&#xff0c;如果A的非边界元素A[i][j]大于相邻的上下左右4个元素&#xff0c;那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。 输入格式&#xff1a; 输入在第一行中给出矩阵A的行数M和列数N&#xff08;3≤…

C语言创建结构体时 什么时候需要C++引用 什么情况下下不需要引用

在C语言中&#xff0c;结构体通常通过传递指针来实现对结构体的修改。当在函数中需要修改结构体的内容&#xff0c;并且希望这些修改在调用函数后仍然保持&#xff0c;可以考虑使用指针。引用是C中的一种特殊机制&#xff0c;用于更方便地传递参数&#xff0c;但在纯粹的C语言中…

《springcloud alibaba》 三 sentinel流量控制

目录 sentinel准备流控规则 qpspom.xmlapllication.yml启动类controller查看结果流控提示不太友好 流控规则 线程数全局异常处理pom.xmlapplication.yml启动类实体类controller类异常类测试 关联流控模式关联jmeter 链路servicecontroller代码调整 流控效果Warm UP 熔断降级规则…