代码随想录第25天|回溯part5 通用的去重法:set

491.非递减子序列

中等题
在这里插入图片描述
这个题给出的实例很有陷阱性,之前的题是通过排序来对于相同树层的元素去重,而本题是求非递减子序列,如果排序了那就已经是自增子序列了,达不到题目的要求。
看图
在这里插入图片描述
可以看出,对于一个集合[4,7],如果之前选择了7,那么在后面的7就不必选择了,因为如果选择了前面的7之后,一定递归到了包含了选择后一个7产生的所有情况
比如[4,7,6,7,9]
选择前面的7则有[4,7,7,9] [4,7] [4,7,9] [4,7,7]
如果只是选择后面的 7则有情况[4,7] [4,7,9] 可以看出前面一定是包括了后面的情况的,所以我们同样需要对于同一树层选择的元素去重
同一父节点下的同层上使用过的元素就不能再使用了

需要注意的点,unordered_set uset; 是记录本层元素是否重复使用,新的一层uset都会重新定义(清空),所以要知道uset只负责本层!所以递归完之后不需要清除,因为代表已使用过

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void backTracking(vector<int>& nums, int step) {
        if (path.size() >= 2) {
            res.push_back(path);
        }
        if (step >= nums.size()) {
            return;
        }
        unordered_set<int> uset;
        for (int i = step; i < nums.size(); i++) {
            if (uset.find(nums[i]) != uset.end())
                continue;
            if (path.size() > 0 && path[path.size() - 1] > nums[i])
                continue;
            uset.insert(nums[i]);
            path.push_back(nums[i]);
            backTracking(nums, i + 1);
            path.pop_back();
        }
    }
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        // sort(nums.begin(),nums.end());
        backTracking(nums, 0);
        return res;
    }
};

go代码

var (
	res  [][]int
	path []int
)

func backTracking(nums []int, step int) {
	if len(path) > 1 {
		p := make([]int, len(path))
		copy(p, path)
		res = append(res, p)
	}
	if step >= len(nums) {
		return
	}
	uset := make(map[int]bool)
	for i := step; i < len(nums); i++ {
		if uset[nums[i]] {
			continue
		}
		if len(path) > 0 && path[len(path)-1] > nums[i] {
			continue
		}
		uset[nums[i]] = true
		path = append(path, nums[i])
		backTracking(nums, i+1)
		path = path[:len(path)-1]
	}
}

func findSubsequences(nums []int) [][]int {
	res = [][]int{}
	path = []int{}
	backTracking(nums, 0)
	return res
}

46.全排列

在这里插入图片描述
模板题,不多说了,它不允许有重复元素出现
go代码

var (
	used []bool
	res  [][]int
	path []int
)

func backTracking(nums []int, used []bool) {
	if len(path) == len(nums) {
		temp := make([]int, len(path))
		copy(temp, path)
		res = append(res, temp)
		return
	}
	for i := 0; i < len(nums); i++ {
		if used[i] {
			continue
		}
		used[i] = true
		path = append(path, nums[i])
		backTracking(nums, used)
		used[i] = false
		path = path[:len(path)-1]
	}
}
func permute(nums []int) [][]int {
	used = make([]bool, len(nums))
	res = [][]int{}
	path = []int{}
	backTracking(nums, used)
	return res
}

47.全排列2

在这里插入图片描述
这道题和之前的区别就是,它允许有重复元素出现,这就会导致在同一树层中可能选取值相同的元素,所以需要去重,这道题可以排序用used数组,也可以定义uset集合,这里我定义了集合

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void backTracking(vector<int>& nums, vector<bool>& used) {
        if (path.size() == nums.size()) {
            res.push_back(path);
            return;
        }
        unordered_set<int> uset;
        for (int i = 0; i < nums.size(); i++) {
            if (uset.find(nums[i]) != uset.end()) {
                continue;
            }
            if (used[i])
                continue;
            used[i] = true;
            uset.insert(nums[i]);
            path.push_back(nums[i]);
            backTracking(nums, used);
            used[i] = false;
            path.pop_back();
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<bool> used(nums.size(), false);
        backTracking(nums, used);
        return res;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超实用的新闻稿撰写模板分享,纯干货

一篇优秀的新闻稿&#xff0c;能为企业带来良好的口碑和传播效果。本文伯乐网络传媒将深入探讨新闻稿撰写前的准备工作&#xff0c;并提供一套实用的新闻稿结构模板&#xff0c;助你轻松打造高质量新闻稿。 一、新闻稿撰写前的准备 1. 明确新闻稿的主题和目的 在动笔之前&…

免费开源图片转文字识别软件:Umi-OCR

目录 1.介绍 2.项目亮点 3.项目功能&#xff08;已实现&#xff09; 4.功能体验 5.项目集成&#xff08;调用接口&#xff09; 6.项目地址 1.介绍 Umi-OCR&#xff1a;免费&#xff0c;开源&#xff0c;可批量的离线OCR软件&#xff0c;目前适用于 Windows7 x64 及以上。…

Unity开发Cosmos使用BNG Framework获取按键信息

Unity开发Cosmos使用BNG Framework获取按键信息 1、新建一个脚本&#xff0c;复制下面代码 using BNG;[Header("Input")]//[Tooltip("The key(s) to use to toggle locomotion type")]public List<ControllerBinding> locomotionToggleInput new …

Tomcat相关概述和部署

目录 一、Tomcat知识 1.Tomcat概述 2.Tomcat组件构成 3.Tomcat 功能组件结构 4.Tomcat的请求过程 二、tomcat服务部署 1.老样子准备工作——关闭防火墙和selinux&#xff0c;防止其对安装过程的干扰 2.将准备好的软件包拖入/opt目录下&#xff0c;进行安装JDK 3.设置J…

鬼畜恶搞类型的视频素材哪里找?热门搞笑素材网站分享

在当今数字媒体时代&#xff0c;寻找优质的视频素材变得尤为重要&#xff0c;尤其是对于喜欢鬼畜恶搞风格的创作者来说&#xff0c;选择合适的素材网站可以大大提升视频的吸引力和观看体验。本文将为短视频创作者和自媒体运营者介绍一些顶级的视频素材网站和工具&#xff0c;特…

C++基础编程100题-004 OpenJudge-1.1-06 空格分隔输出

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0101/06/ 描述 读入一个字符&#xff0c;一个整数&#xff0c;一个单精度浮点数&#xff0c;一个双精度浮点数&#xff0c;然后按顺序输出它们&#xff0c;并且要求在他们之间用一个空格分隔。输出浮点数时保留…

短视频系列内容生产技能提升 沈阳短视频剪辑培训

优势&#xff1a;一、短视频系列化内容的优势 ①可持续性强 某一条视频效果很好(几十万点赞)时&#xff0c;按照相同格式继续输出非常容易成功: √不需要设计脚本&#xff1b; √不需要重新定制。 √稳定性强&#xff0c; ②节约时间成本和制作成本 举例对标账号&#xf…

Ollama+FastAPI+React手把手构建自己的本地大模型,支持SSE

最近大家都在玩LLM&#xff0c;我也凑了热闹&#xff0c;简单实现了一个本地LLM应用&#xff0c;分享给大家&#xff0c;百分百可以用哦&#xff5e;^ - ^ 先介绍下我使用的三种工具&#xff1a; Ollama&#xff1a;一个免费的开源框架&#xff0c;可以让大模型很容易的运行在…

【Postman接口测试】第五节.Postman接口测试项目实战(下)

文章目录 前言七、课程添加接口postman测试 7.1 课程添加接口文档 7.2 针对课程添加设计接口测试用例 7.2.1 提取测试点 7.2.2 设计测试用例 7.2.2 使用Postman进行接口测试八、查询课程列表接口postman测试 8.1 查询…

插件:Plugins

一、安装网格插件

Allegro器件角度倾斜如何回正?

Allegro器件角度倾斜,坐标含有小数点调整为45度整数倍的方法 Allegro器件角度倾斜回正的方法。 在用Allero进行PCB设计过程中,有时候由于误操作;或者刚开始器件需要非45度整数倍的角度,后又需要调整为整数倍的角度。器件角度倾斜含有小数点调整为45度整数倍的方法。 1、如…

小白学大模型:Hugging Face Tokenizer

Tokenizer介绍 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Tokenizer&#xff08;分词器&#xff09;是准备输入模型的关键步骤之一。Hugging Face 提供了用于各种模型的分词器库&#xff0c;其中大多数分词器都以两种风格提供&#xff1a;一种是完整的 Pytho…

使用 MDC 实现日志链路跟踪,包教包会!

在微服务环境中&#xff0c;我们经常使用 Skywalking、Spring Cloud Sleut 等去实现整体请求链路的追踪&#xff0c;但是这个整体运维成本高&#xff0c;架构复杂&#xff0c;本次我们来使用 MDC 通过 Log 来实现一个轻量级的会话事务跟踪功能&#xff0c;需要的朋友可以参考一…

三十七、openlayers官网示例Earthquakes Heatmap解析——在地图上加载热力图

官网demo地址&#xff1a; Earthquakes Heatmap 这篇主要介绍了热力图HeatmapLayer HeatmapLayer 是一个用于在地图上显示热力图的图层类型&#xff0c;通常用于表示地理数据中的密度或强度。例如&#xff0c;它可以用来显示地震、人口密度或其他空间数据的热点区域。在这个示…

springboot3 一些听课笔记(1)

文章目录 一、日志框架二、springboot 自动配置三 、springweb3.13.2 自己编写一个messageconvert3.2.2 如果我们想让其支持yaml格式呢&#xff1f; 一、日志框架 springboot底层 默认使用logbacksjf4j作为日志框架。 1、每个 starter 场景&#xff0c;都会导入一个核心场景 …

鸿蒙开发接口安全:【@system.cipher (加密算法)】

加密算法 说明&#xff1a; 本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import cipher from system.ciphercipher.rsa rsa(Object): void RSA 算法加解密。 系统能力&#xff1a; SystemCapabil…

JVM学习-Jprofiler

JProfiler 基本概述 特点 使用方便&#xff0c;界面操作友好对被分析的应用影响小(提供模板)CPU&#xff0c;Tread&#xff0c;Memory分析功能尤其强大支持对jdbc,noSql,jsp,servlet,socket进行分析支持多种模式(离线、在线)的分析支持监控本地、远程JVM跨平台&#xff0c;拥…

Android WebView上传文件/自定义弹窗技术,附件的解决方案

安卓内核开发 其实是Android的webview默认是不支持<input type"file"/>文件上传的。现在的前端页面需要处理的是&#xff1a; 权限 文件路径AndroidManifest.xml <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&g…

代理IP类型有哪些?定义与区别

您应该对代理有了一定的了解。但是&#xff0c;代理服务器也有不同的类型。就其来源而言&#xff0c;最常见的代理服务器类型是住宅代理和数据中心代理&#xff1a; 1、住宅代理 住宅代理是 ISP 向房主提供的 IP 地址。它是与物理位置关联的真实 IP 地址&#xff0c;因此允许…

运放应用1 - 反相放大电路

1.前置知识 反相放大电路存在 负反馈电路 &#xff0c;工作在线性区&#xff0c;可以利用 虚短 概念来分析电路。 注&#xff1a;运放的 虚断 特性是一直存在的&#xff0c;虚短特性则需要运放工作在 线性区 有关运放的基础知识&#xff0c;可以参考我的另外一篇文章&#xff…