回溯总结2(子集问题)

news2025/1/21 13:46:45

78 子集

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例: 输入: nums = [1,2,3] 输出: [ [3],   [1],   [2],   [1,2,3],   [1,3],   [2,3],   [1,2],   [] ]

思路

回溯返回条件,index==num,size()

class Solution {

public:

    vector<vector<int>>res;
    void backtracing(vector<int>& nums,vector<int>& path,int startIndex){
        if(startIndex==nums.size()){
            return;
        }

        for(int i = startIndex;i<nums.size();i++){
            path.push_back(nums[i]);
            res.push_back(path);
            startIndex++;
            backtracing(nums,path,startIndex);
            path.pop_back();
        }
    }

    vector<vector<int>> subsets(vector<int>& nums) {
        vector<int> path;
        int startIndex=0;
        res.push_back(path);
        backtracing(nums,path,startIndex);
        return res;
    }

};

90 子集

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:

  • 输入: [1,2,2]
  • 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]

思路

参考组合总和||,关键是去重
有了index就不需要used数组

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void dfs(vector<int>& nums, int startIndex) {
        // 每个路径都是一个合法的子集,直接加入结果
        res.push_back(path);
        // 遍历当前可选的数字
        for(int i = startIndex; i < nums.size(); i++) {
            // 跳过重复元素(同一层)
            if(i > startIndex && nums[i] == nums[i-1]) {
                continue;
            }
            // 选择当前数字
            path.push_back(nums[i]);
            // 递归搜索
            dfs(nums, i + 1);
            // 回溯,撤销选择
            path.pop_back();
        }
    }
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(), nums.end());  // 排序,便于去重
        dfs(nums, 0);
        return res;
    }
};

491 递增子序列

给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。
示例:

  • 输入: [4, 6, 7, 7]
  • 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]
    说明:
  • 给定数组的长度不会超过15。
  • 数组中的整数范围是 [-100,100]。
  • 给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。
    题目要求递增子序列大小至少为2

思路

  1. 剪枝,选出所有组合,然后找到递增序列
    unordered_set<int> uset; 是记录本层元素是否重复使用,新的一层uset都会重新定义(清空),所以要知道uset只负责本层!

注意:
 // 用于判断是否可以将当前元素添加到路径中

bool isValid(vector& nums, int i, unordered_set& used) {

return (path.empty() || nums[i] >= path.back()) && !used.count(nums[i]);

}

class Solution {

public:
    vector<vector<int>> res;
    vector<int> path;
    // 用于判断是否可以将当前元素添加到路径中
    bool isValid(vector<int>& nums, int i, unordered_set<int>& used) {
        return (path.empty() || nums[i] >= path.back()) && !used.count(nums[i]);
    }
    void backtracing(vector<int>& nums, int startIndex) {
        if (path.size() >= 2) { // 确保只存储有效长度的路径
            res.push_back(path);
        }

        if (startIndex == nums.size()) return;
        unordered_set<int> used; // 用于记录当前层级访问过的数字
        for (int i = startIndex; i < nums.size(); i++) {
            // 使用封装后的 isValid 函数来判断是否可以继续
            if (!isValid(nums, i, used)) {
                continue;
            }
            used.insert(nums[i]); // 记录当前数字
            path.push_back(nums[i]);
            backtracing(nums, i + 1);
            path.pop_back(); // 回溯
        }
    }

    vector<vector<int>> findSubsequences(vector<int>& nums) {
        res.clear();
        path.clear();
        backtracing(nums, 0);
        return res;
    }
};

1. 布尔数组标记法 (适用于子集问题)

特点

  • 实现简单,空间效率高。
  • 适用于一般的子集/组合问题,特别是对于需要返回所有可能的子集的情况。

举例题目

  • LeetCode 90: Subsets II(子集 II):给定一个可能包含重复元素的整数数组 nums,返回所有可能的子集(包含空集)。需要去重。

题目描述

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

2. 计数map法 (适用于元素重复次数较多的情况)

特点

  • 高效处理重复元素较多的情况。
  • 需要额外空间来存储每个元素的计数。

举例题目

  • LeetCode 90: Subsets II(子集 II)和 LeetCode 40: Combination Sum II(组合总和 II):对于包含重复元素的数组,避免重复组合。

题目描述

输入: candidates = [10,1,2,7,6,5], target = 8
输出:
[
  [1, 2, 5],
  [1, 7],
  [2, 6]
]

3. 选或不选法 (适用于有限制的组合问题)

特点

  • 思路清晰,适合处理有选择限制的组合问题。
  • 在某些情况下可能实现较复杂。

举例题目

  • LeetCode 78: Subsets:给定一个不含重复元素的整数数组,返回其所有子集。

题目描述

输入: nums = [1, 2, 3]
输出: 
[
  [],
  [1],
  [2],
  [3],
  [1,2],
  [1,3],
  [2,3],
  [1,2,3]
]
  • LeetCode 46: Permutations(排列):给定一个没有重复数字的序列,返回其所有可能的排列。

题目描述

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

4. 交换法 (排列专用)

特点

  • 不需要额外数组来记录路径,直接在原数组上进行操作。
  • 适用于排列问题,尤其是要求去重的排列。

举例题目

  • LeetCode 47: Permutations II:给定一个可包含重复数字的序列,返回所有不重复的排列。

题目描述

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

总结:

  • 布尔数组标记法:适合标准的子集问题,简单且高效。
  • 计数map法:适合处理重复元素较多的情况,使用额外的计数信息来避免重复。
  • 选或不选法:适合限制条件较为复杂的组合问题,尤其是元素选择有上限时。
  • 交换法:专门用于排列问题,避免重复排列,操作在原数组上进行。

每种方法适用的场景不同,选择时需要考虑问题的性质、元素是否重复以及对时间空间的要求。

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

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

相关文章

SQL在线格式化 - 加菲工具

SQL在线格式化 - 加菲工具 打开网站 加菲工具 https://www.orcc.online 选择“SQL 在线格式化” 或者直接访问网址 https://www.orcc.online/tools/sql 输入sql&#xff0c;点击上方的格式化按钮即可 输入框得到格式化后的sql结果

WPF1-从最简单的xaml开始.md

1. 最简单的WPF应用 1.1. App.config1.2. App.xaml 和 App.xaml.cs1.3. MainWindow.xaml 和 MainWindow.xaml.cs 2. 正式开始分析 2.1. 声明即定义2.2. 命名空间 2.2.1. xaml的Property和Attribute2.2.2. xaml中命名空间2.2.3. partial关键字 学习WPF&#xff0c;肯定要先学…

cursor重构谷粒商城02——30分钟构建图书管理系统【cursor使用教程番外篇】

前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶到中高阶程序员。 本项目将基于谷粒商城…

Linux探秘坊-------3.开发工具详解(1)

1 初识vim编辑器 创建第一个vim编辑的代码 1.新建文件 2.使用vim打开 3.打开默认是命令模式&#xff0c;写代码需要在屏幕上输出“i”字符 1.写完代码后要按Esc键退出到指令模式2.再按shift:wq即可保存并退出vim &#xff08;因为不支持鼠标&#xff0c;通常 使用键盘上的箭…

ESP-Skainet语音唤醒技术,设备高效语音识别方案,个性化交互应用

在当今数字化、智能化飞速发展的时代&#xff0c;物联网&#xff08;IoT&#xff09;与人工智能&#xff08;AI&#xff09;的深度融合正在重塑我们的生活和工作方式。 在智能家居的生态系统中&#xff0c;语音唤醒技术不仅能够为用户提供个性化的服务&#xff0c;还能通过定制…

25西湖ctf

2025西湖冬季 图片不全去我blog找&#x1f447; 25西湖 | DDLS BLOG 文章所有参考将在文末给出 web web1 ssti 太简单的不赘述&#xff0c;知道用就行 {{cycler.__init__.__globals__.__builtins__[__import__](os).popen($(printf "\150\145\141\144\40\57\146\1…

Linux C\C++方式下的文件I/O编程

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 Lin…

python轻量级框架-flask

简述 Flask 是 Python 生态圈中一个基于 Python 的Web 框架。其轻量、模块化和易于扩展的特点导致其被广泛使用&#xff0c;适合快速开发 Web 应用以及构建小型到中型项目。它提供了开发 Web 应用最基础的工具和组件。之所以称为微框架&#xff0c;是因为它与一些大型 Web 框架…

python+pygame+pytmx+map editor开发一个tiled游戏demo 05使用object层初始化player位置

代码 import mathimport pygame# 限制物体在屏幕内 import pytmxdef limit_position_to_screen(x, y, width, height):"""限制物体在屏幕内"""x max(0, min(x, SCREEN_WIDTH - width)) # 限制x坐标y max(0, min(y, SCREEN_HEIGHT - height))…

上位机工作感想-2024年工作总结和来年计划

随着工作年限的增增长&#xff0c;发现自己越来越不喜欢在博客里面写一些掺杂自己感想的东西了&#xff0c;或许是逐渐被工作逼得“成熟”了吧。2024年&#xff0c;学到了很多东西&#xff0c;做了很多项目&#xff0c;也帮别人解决了很多问题&#xff0c;唯独没有涨工资。来这…

Ubuntu离线docker compose安装DataEase 2.10.4版本笔记

1、先准备一个可以正常上网的相同版本的Ubuntu系统&#xff0c;可以使用虚拟机。Ubuntu系统需要安装好docker compose或docker-compose 2、下载dataease-online-installer-v2.10.4-ce.tar在线安装包&#xff0c;解压并执行install.sh进行安装和启动 3、导出docker镜像 sudo d…

Web开发 -前端部分-CSS-2

一 长度单位 代码实现&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

Data Filtering Network 论文阅读和理解

目录 一、TL&#xff1b;DR 二、Introduction 2.1 apple的结论 2.2 业界做法&#xff1a; 2.3 我们的做法&#xff08;Apple&#xff09; 2.4 如何获取好的DFN 三、未完待续&#xff08;这周出去购物了&#xff0c;下周继续补充&#xff09; 一、TL&#xff1b;DR 核心…

计算机网络 (48)P2P应用

前言 计算机网络中的P2P&#xff08;Peer to Peer&#xff0c;点对点&#xff09;应用是一种去中心化的网络通信模式&#xff0c;它允许设备&#xff08;或节点&#xff09;直接连接并共享资源&#xff0c;而无需传统的客户端-服务器模型。 一、P2P技术原理 去中心化架构&#…

.Net Core微服务入门全纪录(五)——Ocelot-API网关(下)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

Python网络自动化运维---SSH模块

目录 SSH建立过程 实验环境准备 一.SSH模块 1.1.Paramiko模块 1.1.1实验代码 1.1.2代码分段讲解 1.1.3代码运行过程 1.2Netmiko模块 Netmiko模块对比paramiko模块的改进&#xff1a; 1.2.1实验代码 1.2.2代码分段讲解 1.2.3代码运行过程 二.Paramiko模块和Ne…

Linux:进程概念详解

进程详解 一、冯诺依曼计算机体系&#xff08;一&#xff09;体系概念&#xff08;二&#xff09;计算机之间的数据传输 二、操作系统&#xff08;一&#xff09;操作系统设计的意义&#xff08;二&#xff09;操作系统的管理功能&#xff08;三&#xff09;系统调用的实质 三、…

【数据分享】1929-2024年全球站点的逐年平均气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…

STM32之CubeMX图形化工具开发介绍(十七)

STM32F407 系列文章 - STM32CubeMX&#xff08;十七&#xff09; 目录 前言 一、CubeMX 二、下载安装 1.下载 2.安装 3.图解步骤 三、用户界面 1.项目配置 2.项目生成 3.项目文件解释 4.新建工程 5.查看原工程 四、FAQ 总结 前言 STMCube源自意法半导体&#xf…

top命令返回值有异常问题解决

异常问题&#xff1a;load average值不正常 排查思路&#xff1a; 1.找到是哪个进程引起的异常&#xff0c;看看是否有cpu占用过高或者mem占用过高的进程 再根据具体情况分析原因。 定位到异常进程后&#xff0c;首先打堆栈&#xff0c;留存现场日志&#xff0c;然后停止进…