代码随想录算法训练营第29天|491.递增子序列 * * 46.全排列 * 47.全排列 II

文章目录

  • 491.递增子序列
    • 思路:
      • 代码
    • 思路:优化
      • 代码:
  • 46.全排列
    • 思路
      • 代码一:使用used数组
      • 代码二:使用path判断元素
  • 47.全排列 II
    • 思路一:层节点和路径都是用used数组做记录
    • 思路二:层通过排序后是否重复过滤

491.递增子序列

在这里插入图片描述

思路:

在这里插入图片描述
在这里插入图片描述

代码

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path=new LinkedList<>();public List<List<Integer>> findSubsequences(int[] nums) {backtracking(nums,0);return res;}public void backtracking(int[] nums,int startIndex){// if(startIndex>=nums.length-1)return;if(path.size()>1){res.add(new ArrayList<>(path));}int[] used = new int[201];for(int i=startIndex;i<nums.length;i++){if(!path.isEmpty()&&path.getLast()> nums[i]|| (used[nums[i]+100]==1)){continue;}used[nums[i]+100]=1;path.add(nums[i]);backtracking(nums,i+1);path.removeLast();}}
}

思路:优化

通过数组去重,取代hashset
在这里插入图片描述

代码:

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path=new ArrayList<>();public List<List<Integer>> findSubsequences(int[] nums) {backtracking(nums,0);return res;}public void backtracking(int[] nums,int startIndex){// if(startIndex>=nums.length-1)return;if(path.size()>1){res.add(new ArrayList<>(path));}int[] used = new int[201];for(int i=startIndex;i<nums.length;i++){if(!path.isEmpty()&&path.get(path.size() -1 ) > nums[i]|| (used[nums[i]+100]!=0)){continue;}used[nums[i]+100]=1;path.add(nums[i]);backtracking(nums,i+1);path.remove(path.size() -1);}}
}

46.全排列

在这里插入图片描述

思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码一:使用used数组

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> permute(int[] nums) {boolean[] used=new boolean[nums.length];backtracking(nums,used);return res;}public void backtracking(int[] nums,boolean[] used){if(path.size()==nums.length){res.add(new ArrayList<>(path));return;}for(int i=0;i<nums.length;i++){// System.out.println("数值"+nums[i]+"布尔值"+used[nums[i]+10]);if(used[i]){continue;}path.add(nums[i]);used[i]=true;backtracking(nums,used);used[i]=false;path.remove(path.size()-1);}}
}

代码二:使用path判断元素

path是linkedlist

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new LinkedList<>();public List<List<Integer>> permute(int[] nums) {// boolean[] used=new boolean[nums.length];backtracking(nums);return res;}public void backtracking(int[] nums){if(path.size()==nums.length){res.add(new ArrayList<>(path));return;}for(int i=0;i<nums.length;i++){// System.out.println("数值"+nums[i]+"布尔值"+used[nums[i]+10]);if(path.contains(nums[i])){continue;}path.add(nums[i]);backtracking(nums);path.removeLast();}}
}

47.全排列 II

在这里插入图片描述

思路一:层节点和路径都是用used数组做记录

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> permuteUnique(int[] nums) {boolean[] used=new boolean[nums.length];backtracking(nums,used);return res;}public void backtracking(int[] nums,boolean[] used){if(path.size()==nums.length){res.add(new ArrayList<>(path));return;}int[] cengused=new int[21];for(int i=0;i<nums.length;i++){// System.out.println("数值"+nums[i]+"布尔值"+used[nums[i]+10]);if(used[i]||cengused[nums[i]+10]==1){continue;}path.add(nums[i]);cengused[nums[i]+10]=1;used[i]=true;backtracking(nums,used);used[i]=false;path.remove(path.size()-1);}}
}

思路二:层通过排序后是否重复过滤

在这里插入图片描述

class Solution {//存放结果List<List<Integer>> result = new ArrayList<>();//暂存结果List<Integer> path = new ArrayList<>();public List<List<Integer>> permuteUnique(int[] nums) {boolean[] used = new boolean[nums.length];Arrays.fill(used, false);Arrays.sort(nums);backTrack(nums, used);return result;}private void backTrack(int[] nums, boolean[] used) {if (path.size() == nums.length) {result.add(new ArrayList<>(path));return;}for (int i = 0; i < nums.length; i++) {// used[i - 1] == true,说明同⼀树⽀nums[i - 1]使⽤过// used[i - 1] == false,说明同⼀树层nums[i - 1]使⽤过// 如果同⼀树层nums[i - 1]使⽤过则直接跳过if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {continue;}//如果同⼀树⽀nums[i]没使⽤过开始处理if (used[i] == false) {used[i] = true;//标记同⼀树⽀nums[i]使⽤过,防止同一树枝重复使用path.add(nums[i]);backTrack(nums, used);path.remove(path.size() - 1);//回溯,说明同⼀树层nums[i]使⽤过,防止下一树层重复used[i] = false;//回溯}}}
}

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

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

相关文章

学习Vue3的第一天

目录 简介 什么是 Vue&#xff1f; 创建Vue3工程 前提条件 基于 vue-cli 创建&#xff08;不推荐&#xff09; 基于 vite 创建&#xff08;推荐&#xff09; 通过 CDN 使用 Vue 代码示例 简介 什么是 Vue&#xff1f; Vue.js 是一个流行的前端 JavaScript 框架&#…

c# DataTable 帮助类

public class DataTableHelper { #region DataTable转IList /// <summary> /// DataTable转IList集合 /// </summary> /// <typeparam name"T"></typeparam> /// <param name"dataTabl…

linux查看公网地址

curl ifconfig.mewget -qO- ifconfig.me

用keytool 生成JWT的RSA非对称密钥

写在前面 JWT 令牌 可以由 X.509 证书或 256 位非对称密钥签名来充当&#xff0c;为了获得合法的JWT 令牌&#xff0c;我们可以使用JDK中的keytool.exe工具来生成。 本例的操作环境是Windows系统&#xff0c;操作的前置条件需要先安装好JDK&#xff0c;并配置好环境变量&…

C#的Char 结构的像IsLetterOrDigit(Char)等常见的方法

目录 一、Char 结构的方法 二、Char.IsLetterOrDigit 方法 1.Char.IsLetterOrDigit(Char)用法 2.IsLetterOrDigit(String, Int32)方法 三、Char.IsLetter 方法 1.IsLetter(Char) 2.IsLetter(String, Int32) 四、Char.IsDigit 方法 1. IsDigit(String, Int32) 2.IsDig…

Vue 学习随笔系列九 -- 表格中插入图片、背景、自定义表头

表格中插入图片和icon 文章目录 表格中插入图片和icon一、如何插入图片1、代码2、效果 二、文字添加背景1、代码2、效果 三、表头悬浮提示语四、表头添加图标 一、如何插入图片 1、代码 <template><div><el-tablesize"small"borderv-loading"l…

K8S部署Harbor镜像仓库(含离线安装包harbor-offline-installer国内下载链接)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

互联网摸鱼日报(2024-02-05)

互联网摸鱼日报(2024-02-05) 博客园新闻 巨人网络大模型GiantGPT完成备案 有传闻称京东紧急制定主播招聘计划 不考核GMV和毛利等 实测百度文心一言APP生成“专属数字分身”免费功能 小米要退出印度笔记本市场&#xff1f;产品均售罄、官网导航条移除相关栏目 高德、百度地…

面向智算服务,构建可观测体系最佳实践

作者&#xff1a;蓟北 构建面向 AI、大数据、容器的可观测体系 &#xff08;一&#xff09;智算服务可观测概况 对于越来越火爆的人工智能领域来说&#xff0c;MLOps 是解决这一领域的系统工程&#xff0c;它结合了所有与机器学习相关的任务和流程&#xff0c;从数据管理、建…

Qt程序设计-读写CSV文件

本文实例演示Qt读写CSV文件实现 创建项目 添加两个按钮和一个显示路径的label 界面如下 UI界面 <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"><class>MainWindow</class><widget class="QM…

[BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析

保护 ida 这里使用mmap函数创造了一个内存映射区域 从地址0x123000开始&#xff0c;大小位0x1000 权限为可写可执行&#xff08;可读0x1&#xff0c;可写0x2&#xff0c;可执行0x3&#xff09; 设置为私有映射&#xff08;MAP_PRIVATE&#xff09;和匿名映射&#xff08;MAP…

【buuctf--被偷走的文件】

将 ftp 流量过滤下来&#xff0c;追踪 ftp 流量&#xff0c;得到下图 先解释一下这四行什么意思&#xff1a; PASV&#xff1a; 这是FTP的命令&#xff0c;用于告知服务器在数据连接中使用被动模式&#xff08;Passive Mode&#xff09;。在被动模式下&#xff0c;数据连接的…

Java Stram 流对于返回对象的处理 (结束流)

Java Stram 流对于返回对象的处理 &#xff08;结束流&#xff09; package com.zhong.streamdemo.showdownstreamdemo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.util.*; import java.util.stream.Collectors; im…

【golang】24、go get 和 go mod:indrect 与 go mod tidy

文章目录 go get 会执行如下操作&#xff1a; 操作 go.mod 文件&#xff08;add、update、remove&#xff09;下载依赖到 $GOPATH/pkg/mod 中若已安装&#xff0c;则更新该包&#xff0c;到最新版本 试验前置准备&#xff1a;首先删除已下载的依赖&#xff0c;rm -rf $GOPATH…

MySQL篇----第十四篇

系列文章目录 文章目录 系列文章目录前言一、MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?二、锁的优化策略三、索引的底层实现原理和优化四、什么情况下设置了索引但无法使用前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽…

OpenId、UnionId

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. OpenId1.1 概念1.2 公众号OpenId&#xff08;简称 wxopenid&#xff09;同一个微信用户在小程序和公众号上的openid是不同的 1.3 openid的获取方式方式1. 调用wx…

图片视频上传压缩的考察

本文仅做上传 / 纯客户端压缩功能的调研 上传 能否在上传时就限制图片的张数&#xff1f;移动端不能使图库变成禁止状态&#xff0c;用户点击完成之后才能进行校验。 能否限制上传的文件格式&#xff1f;可以限制&#xff0c;PC端能够完美限制&#xff0c;移动端只能部分限制…

《Docker极简教程》--Docker环境的搭建--在Linux上搭建Docker环境

更新系统&#xff1a;首先确保所有的包管理器都是最新的。对于基于Debian的系统&#xff08;如Ubuntu&#xff09;&#xff0c;可以使用以下命令&#xff1a;sudo apt-get update sudo apt-get upgrade安装必要的依赖项&#xff1a;安装一些必要的工具&#xff0c;比如ca-certi…

Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案

目录 发现问题 解决办法 第一步 第二步 第三步 第四步 最后一步 问题解决 发现问题 如果大家也遇到下面这种问题&#xff0c;可能是没有include文件夹中没有bits/stdc.h 解决办法 第一步 打开一个C项目&#xff0c;鼠标移动至头文件上右击&#xff0c;选择转到文档或…

怎么能批量验证收件箱有效性

批量验证收件箱有效性是确保邮件营销活动成功送达目标受众的关键步骤。以下将介绍几种方法来实现这一目标。 首先&#xff0c;可以使用专业的邮件验证服务。这些服务通常提供API接口或批量上传功能&#xff0c;能够快速检查大量邮件地址的有效性。它们通过验证邮件地址的语法、…