算法训练营Day26

#Java #全排列 #回溯

开源学习资料

Feeling and experiences:

递增子序列:力扣题目链接

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

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

这道题要注意的点:

目的就是早递增子序列,所以不能对原来的数值进行排列

所以不能像子集II 那个问题一样,先给数组中的元素排好顺序,再来用used数组标记。

class Solution {List<List<Integer>> ans = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> findSubsequences(int[] nums) {back(nums,0);return ans;}public void back(int []nums,int startIndex){//什么时候收集?if(path.size() >= 2){ans.add(new ArrayList<>(path));}//该题又要去重,又要使其为递增//建立一个Set集合Set<Integer> set = new HashSet<>();for(int i=startIndex;i<nums.length;i++){if(!path.isEmpty() && path.get(path.size()-1)>nums[i] || set.contains(nums[i])){continue;}set.add(nums[i]);path.add(nums[i]);back(nums,i+1);path.remove(path.size()-1);}}
}

 Set集合的使用:(为什么Set集合放在for循环外部?)

1. 去重的目的:

目的是确保在同一递归层级中,不会因为重复选择同一个元素而生成重复的子序列。这是为了防止例如 [1, 2, 2] 这样的数组生成两个相同的子序列 [1, 2]。


2. 作用域的问题:

如果 Set 被放在 for 循环内,那么每次循环时都会创建一个新的 Set。这意味着对于每个元素,Set 都是空的,所以每个元素都会被认为是“新”的,从而无法阻止同一层级中的重复选择。


3. 保持状态:

将 Set 放在 for 循环外部,可以让它在整个递归调用的特定层级中保持状态。这样,当递归到同一层级的不同部分时,Set 中已经包含了该层级中先前考虑过的元素,有效防止重复。

全排列:力扣题目链接

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

经典的模板题

这里引用代码随想录中的图解:

class Solution {List<List<Integer>> ans = new ArrayList<>();List<Integer> path = new ArrayList<>();boolean []used;public List<List<Integer>> permute(int[] nums) {used = new boolean[nums.length];Arrays.fill(used,false);back(nums);return ans;}public void back(int []nums){if(path.size() == nums.length){ans.add(new ArrayList<>(path));}for(int i = 0;i<nums.length;i++){//判断是否用过if(used[i] == true){continue;}used[i] = true;path.add(nums[i]);back(nums);used[i] = false;path.remove(path.size()-1);}}
}

充分利用了used数组~

全排列 II:力扣题目链接

给定一个可包含重复数字的序列 nums按任意顺序 返回所有不重复的全排列。

关键点:树层去重

class Solution {List<List<Integer>> ans = new ArrayList<>();List<Integer> path = new ArrayList<>();boolean []used;public List<List<Integer>> permuteUnique(int[] nums) {//把数组进行排列Arrays.sort(nums);used = new boolean[nums.length];Arrays.fill(used,false);back(nums);return ans;}public void back(int []nums){if(path.size() == nums.length){ans.add(new ArrayList<>(path));return;}for(int i =0;i<nums.length;i++){//去重if(i>0 && nums[i] == nums[i-1] && used[i-1] == true){continue;}if(used[i] == false){used[i] = true;path.add(nums[i]);//回溯back(nums);path.remove(path.size()-1);used[i] = false;}}}
}

 整体思路:

• 首先,将数组排序。这样,相同的元素会相邻,便于去重。
• 在 back 方法中,使用 if 条件进行去重:
• if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true):这个条件检查当前元素是否与前一个元素相同,并且前一个元素已经被使用过。如果是,就跳过当前元素,避免在同一树层生成重复的排列。

 

此时相望不相闻,

愿逐月华流照君~

Fighting!

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

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

相关文章

GameFi 2024年或将迎来新的爆发!

在数字时代&#xff0c;游戏已经不仅仅是一种娱乐方式&#xff0c;更是一种跨越现实和虚拟界限的全球性文化现象。而游戏金融&#xff08;GameFi&#xff09;正是这场数字革命的下一个巨大风潮。 随着科技的不断发展和创新&#xff0c;2024年&#xff0c;GAMEFI&#xff08;Gam…

vitis HLS中实现canny算法的IP核

一、前言 canny边缘检测主要用于提取图像的边缘&#xff0c;是最常用且有效的边缘检测算法。在AMD赛灵思提供的库函数中&#xff0c;使用xf::cv::Canny和xf::cv::EdgeTracing两个函数实现canny边缘提取。本文举例说明如何在vitis HLS 2023.1中实现canny算法。 二、xf::cv::Cann…

《对话品牌》——活到老“养”到老

本期节目《对话品牌》栏目组邀请到了深圳壹常青健康管理有限公司董事长邬锡娣女士参加栏目录制&#xff0c;分享其企业故事&#xff0c;树立品牌形象&#xff0c;提升品牌价值&#xff01; 节目嘉宾&#xff1a;邬锡娣女士 节目主持人&#xff1a;董倩 节目播出平台&#xf…

Qt之自定义分页(翻页)控件

当数据量较大时,分页显示是个不错的选择。这里用百家姓来演示分页效果,包括首页、上一页、下一页、尾页和跳转。 一.效果 每页15个姓氏。 二.实现 QHPageWidget.h #ifndef QHPAGEWIDGET_H #define QHPAGEWIDGET_H#include <QWidget> #include <QStandardItemMod…

查询速度快 30 倍的 ClickHouse,凭什么替代 ELK?

背景 SaaS 服务未来会面临数据安全、合规等问题。公司的业务需要沉淀一套私有化部署能力&#xff0c;帮助业务提升行业竞争力。为了完善平台系统能力、我们需要沉淀一套数据体系帮助运营分析活动效果、提升运营能力。然而在实际的开发过程中&#xff0c;如果直接部署一套大数据…

059:vue中使用 AJAX来读取来自XML文件的信息

第059个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

CVE-2017-12794_Django debug page XSS漏洞

一、影响版本 Django < 1.10.8 Django < 1.11.5 二、漏洞复现 1、vulhub搭建环境 2、首次向数据库中插入数据&#xff0c;成功插入 3、向数据库中插入相同数据&#xff0c;Django报错&#xff0c;数据被打印且执行 三、漏洞分析 查看DIFF&#xff1a; https://g…

自动生成Java枚举类的工具

0、展示效果 1、文档 ONE,code1,1,描述1 two,code2,2,描述2 THREE,code3,3,描述32、工具类 package com.lfsun.generator.util;import java.io.*;/*** 枚举类生成器*/ public class EnumGenerator {private static final String MODULE_NAME "lfsun-study-generator&quo…

vue3 根据用户权限控制左侧菜单和路由拦截

目录 前言 整体思路 详细开发 1.左侧菜单的显隐控制 2.控制路由权限 补充权限控制 总结 前言 我这里是vue3开发的一个后台管理系统&#xff0c;所以涉及用户权限管理&#xff0c;以及页面权限等&#xff0c;其他模块部分可以查看专栏&#xff0c;这里只对怎么实现根据用…

【本地缓存篇】如何实现本地缓存?

如何实现本地缓存? ✔️典型解析✔️数据结构✔️线程安全✔️对象上限✔️清除策略✔️过期时间 ✔️扩展知识仓基于Caffeine实现本地缓存 ✔️典型解析 所谓本地缓存&#xff0c;就是和应用服务器在一起的缓存工具&#xff0c;将需要缓存的数据放到本地缓存中&#xff0c;可…

YOLOv5-Lite 树莓派4B 15帧教程

【前言】 由于v5Lite仓库遗漏了不少历史问题&#xff0c;最大的问题是毕业后卷起来了&#xff0c;找不到时间更新。 上面是这篇博客的背景&#xff0c;那么先说下结论&#xff0c;使用 v5lite-e 模型&#xff0c;在 树莓派4B&#xff08;4G内存&#xff09; 上&#xff0c;有三…

Unity 爱心血量效果

这里写自定义目录标题 1.准备爱心血条2.HeartUI 代码3.在Inspector窗口中绑定好对象4.在血量减少的地方&#xff0c;调用更新方法5.效果展示 1.准备爱心血条 准备好红色爱心和灰色爱心的图片 2.HeartUI 代码 using System.Collections; using System.Collections.Generic; u…

【AI】计算机视觉VIT文章(Transformer)源码解析

论文&#xff1a;Dosovitskiy A, Beyer L, Kolesnikov A, et al. An image is worth 16x16 words: Transformers for image recognition at scale[J]. arXiv preprint arXiv:2010.11929, 2020 源码的Pytorch版&#xff1a;https://github.com/lucidrains/vit-pytorch 0.前言 …

Erlang、RabbitMQ下载与安装教程(windows超详细)

目录 安装Erlang 1.首先安装RabbitMQ需要安装Erlang环境 2.点击下载好的.exe文件进行傻瓜式安装,一直next即可 3.配置Erlang环境变量 安装RabbitMQ 1.给出RabbitMQ官网下载址&#xff1a;Installing on Windows — RabbitMQ&#xff0c;找到 2.配置RabbitMQ环境变量&#xff0…

软件测试/测试开发丨Pytest学习笔记

Pytest 格式要求 文件: 以 test_ 开头或以 _test 结尾类: 以 Test 开头方法/函数: 以 _test 开头测试类中不可以添加构造函数, 若添加构造函数将导致Pytest无法识别类下的测试方法 断言 与Unittest不同, 在Pytest中我们需要使用python自带的 assert 关键字进行断言 assert…

【强化学习】基于蒙特卡洛MC与时序差分TD的简易21点游戏应用

1. 本文将强化学习方法&#xff08;MC、Sarsa、Q learning&#xff09;应用于“S21点的简单纸牌游戏”。 类似于Sutton和Barto的21点游戏示例&#xff0c;但请注意&#xff0c;纸牌游戏的规则是不同且非标准的。 2. 为方便描述&#xff0c;过程使用代码截图&#xff0c;文末附链…

【k8s源码分析-Apiserver-2】kube-apiserver 结构概览以及主体部分源码分析

参考 Kubernetes 源码剖析&#xff08;书籍&#xff09;kube-apiserver的设计与实现 - 自记小屋 kube-apiserver 核心思想 APIGroupInfo 记录 GVK 与 Storage 的对应关系 将 GVK 转换成&#xff0c;Restful HTTP Path将 Storage 封装成 HTTP Handler将上面两个形成映射&#…

CSP CCF 201409-2 画图 C++满分题解

解题思路&#xff1a; 1.使用二维数组标记每一个方块是否被涂色。 2.注意坐标代表的是点&#xff0c;不是方块&#xff0c;交界处的坐标只能算一个方块。 3.可以看成&#xff1a;每一个坐标都对应它左上角的一个小方块&#xff0c;这样可以避免重复计算方块数 #include<i…

3 个月前被裁员了,心情跌落谷底,直到我看到了这本神书…

3个月前的某一天&#xff0c;正在愉快的打工&#xff0c;突然被喊去谈话&#xff0c;然后就被辞退了。。 加入了找工作的大军 然而&#xff0c;因为疫情&#xff0c;因为大专学历的我&#xff0c;找工作比以往都艰难了许多 很多&#xff0c;纯粹就是因为学历&#xff0c;都不…

第十三届蓝桥杯大赛青少年国赛C++组编程题真题(2022年)

第十三届蓝桥杯大赛青少年国赛C组编程题真题&#xff08;2022年&#xff09; 编程题第 1 题 问答题 电线上的小鸟 题目描述&#xff1a; 在一根电线上落有N只小鸟&#xff0c;有的小鸟头向左看&#xff0c;有的小鸟头向右看&#xff0c;且每只小鸟只能看到它视线前的那一只小…