算法训练(leetcode)二刷第二十一天 | 491. 非递减子序列、*46. 全排列、*47. 全排列 II、D

刷题记录

  • 491. 非递减子序列
  • *46. 全排列
  • *47. 全排列 II
  • D

491. 非递减子序列

leetcode题目地址

题目提供的数据有重复,但结果集中不可有重复组合,且不允许排序,因此需要借助Set或额外的hash表进行标记当前层是否使用了相同元素。

时间复杂度: O ( n ∗ 2 n ) O(n*2^n) O(n2n)
空间复杂度: O ( n ) O(n) O(n)

// java
class Solution {private List<Integer> path = new LinkedList<>();// private Set<List<Integer>> result = new HashSet<>();private List<List<Integer>> result = new ArrayList<>();public void backtracking(int[] nums, int startIdx){if(path.size() > 1) {result.add(new ArrayList<>(path));}Map<Integer, Boolean> hash = new HashMap<>();for(int i=startIdx; i<nums.length; i++){if(hash.getOrDefault(nums[i], false)) continue;if(path.isEmpty() || nums[i] >= path.getLast()){path.add(nums[i]);hash.put(nums[i], true);backtracking(nums, i+1);path.removeLast();}}}public List<List<Integer>> findSubsequences(int[] nums) {backtracking(nums, 0);return result;// return new ArrayList<>(result);}
}

*46. 全排列

leetcode题目地址

全排列与组合问题的区别在于每次搜索都是从0开始,但需要标记哪些数据已使用。当路径长度等与数组长度时加入结果集。本题没有重复数据,因此不存在去重操作,直接回溯即可。

时间复杂度: O ( n ! ) O(n!) O(n!)
空间复杂度: O ( n ) O(n) O(n)

// java
class Solution {public List<Integer> path = new LinkedList<>();public List<List<Integer>> result = new ArrayList<>();public void backtracking(int[] nums, boolean[] used){if(path.size() == nums.length){result.add(new ArrayList<>(path));return;}for(int i=0; i<nums.length; i++){if(used[i]) continue;path.add(nums[i]);used[i] = true;backtracking(nums, used);path.removeLast();used[i] = false;}}public List<List<Integer>> permute(int[] nums) {boolean[] used = new boolean[nums.length];backtracking(nums, used);return result;}
}

*47. 全排列 II

leetcode题目地址

本题中出现了重复数据,因此去重是本题的重点。

借助之前组合问题中的去重方案,先排序,再对挨着的元素进行去重。

但排列问题每次都是从头开始检索,因此需要判断相同元素是否已使用不能用起始下标的方式。

应该查看当前元素是否已使用。这种查看分两种:

  1. 在当前层使用
  2. 在当前分支(递归)使用
  • 当前层使用时,前一个元素的used值应当是false,因为已经访问过经历了一次used[i] = true;和一次used[i] = false;也就是相同元素在当前层使用。
  • 当前分支使用时,前一个元素的used值应当是true,因为是在设置了used[i] = true;之后进入了递归backtracking(nums, used);也就是相同元素在当前分支使用。

时间复杂度: O ( n ! ∗ n ) O(n!*n) O(n!n)
空间复杂度: O ( n ) O(n) O(n)

// java
class Solution {private List<Integer> path = new LinkedList<>();private List<List<Integer>> result = new ArrayList<>();public void backtracking(int[] nums, boolean[] used){if(path.size() == nums.length) {result.add(new ArrayList<>(path));return;}for(int i=0; i<nums.length; i++){// 当前分支if(i>0 && nums[i] == nums[i-1] && !used[i-1]) continue;// 当前层// if(i>0 && nums[i] == nums[i-1] && used[i-1]) continue;if(used[i]) continue;path.add(nums[i]);used[i] = true;backtracking(nums, used);path.removeLast();used[i] = false;}}public List<List<Integer>> permuteUnique(int[] nums) {Arrays.sort(nums);boolean[] used = new boolean[nums.length];backtracking(nums, used);return result;}
}

D

leetcode题目地址

题解思路

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// java

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

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

相关文章

QML-简单项目实战一

一、简介 使用QML创建一个简单的登录界面&#xff0c;代码内容来源于bilibili中的视频。 实现效果图如下&#xff1a; 二、实现步骤 1. 核心控件和布局管理和登录事件处理 import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Window 2.12 /*1. 核心控件和布局…

字节青训-小F的永久代币卡回本计划、

目录 一、小F的永久代币卡回本计划 问题描述 测试样例 解题思路&#xff1a; 问题理解&#xff1a; 数学公式&#xff1a; 代码实现&#xff1a; 最终代码&#xff1a; 运行结果&#xff1a; 二、构造特定数组的逆序拼接 问题描述 测试样例 解题思路&#xff1a;…

[ Linux 命令基础 4 ] Linux 命令详解-文本处理命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

06:(寄存器开发)对上电/复位的SystemInit函数进行分析

SystemInit函数分析 通过第5章的时钟树的学习&#xff0c;基本了解了SystemClock总线&#xff0c;AHB总线&#xff0c;APB1总线&#xff0c;APB2总线的时钟频率。那么单片机一上电或者按下复位时&#xff0c;这些总线的时钟频率是如何变化的喃&#xff1f; 这和STM32的启动文件…

C++ : STL容器(适配器)之stack、queue剖析

STL容器适配器之stack、queue剖析 一、stack、queue的接口&#xff08;一&#xff09;stack 接口说明&#xff08;二&#xff09;queue 接口说明 二、stack、queue的模拟实现&#xff08;一&#xff09;stack、queue是容器适配器stack、queue底层默认容器--deque1、deque概念及…

三菱QD77MS定位模块外部信号选择功能

“外部信号选择功能” 是在使用上/下限限位信号和近点狗信号的情况下&#xff0c;从以下信号中选择的功能。 "QD77MS的外部输入信号 "伺服放大器的外部输入信号 "经由 CPU 的外部输入信号(QD77MS 的缓冲存储器) 经由 CPU 的外部输入信号(QD77MS 的缓冲存储器)的…

Vue3-06_路由

路由 后台路由是根据请求url&#xff0c;匹配请求处理的后台模块&#xff08;路径&#xff09; 前台根据访问路径&#xff0c;决定显示的内容。 路由就是&#xff1a; 访问hash 与内容的对应关系 路由的工作方式 用户点击页面的路由链接导致url地址栏中的Hash值发生了变化前…

【知识科普】TCP与UDP这两者之间的对比

TCP与UDP这两者之间的对比 概述TCP 协议的基本概念TCP 协议的工作原理TCP 协议的报文结构TCP 协议的流量控制TCP 协议的可靠性TCP 与 UDP 的比较TCP 协议的应用TCP 协议的优缺点优点缺点 概述 TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的…

初次体验Tauri和Sycamore(1)

原创作者&#xff1a;庄晓立&#xff08;LIIGO&#xff09; 原创时间&#xff1a;2024年11月10日 原创链接&#xff1a;https://blog.csdn.net/liigo/article/details/143666827 版权所有&#xff0c;转载请注明出处。 前言 Tauri 2.0发布于2024年10月2日&#xff0c;Sycamore…

基于Spring Boot+Vue的学院食材采供管理系统

一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#xff1b;UI库&#xff1a;ElementUI&#xff1b; 开发工具&…

【C++】vector模拟实现、迭代器失效问题(超详解)

vector会使用之后我们来模拟实现一下&#xff0c;通过对vector的模拟实现&#xff0c;我们来说一下迭代器失效问题。 1.准备工作 在头文件vector.h里声明和实现函数&#xff0c;然后在test.cpp里测试代码的正确性。 在vector.h中用命名空间分隔一下&#xff0c;因为c库里面也有…

基于SpringBoot的渔具管理系统【附源码】

基于SpringBoot的渔具管理系统 效果如下&#xff1a; 系统主页面 系统登陆页面 管理员主页面 用户管理页面 渔具信息管理页面 租赁信息管理页面 归还信息管理页面 渔具信息页面 用户登陆页面 个人中心页面 研究背景 随着社会的发展&#xff0c;渔具销售企业之间的竞争与合作…

string

文章目录 一. STL1.概念2.版本 二. string类2.1 为什么学习string类2. 标准库中的string类2.2.1 构造&#xff08;7个&#xff09;2.2.2 对string类对象进行访问和修改&#xff08;1&#xff09;operator[]&#xff08;2&#xff09;迭代器1.迭代器的使用2.迭代器的价值&#x…

B2B订货系统功能设计与代码开发(PHP + MySQL)

在B2B&#xff08;Business to Business&#xff09;电子商务中&#xff0c;企业之间的商品订购、交易和供应链管理是核心功能。一个高效的B2B订货系统可以帮助企业管理库存、订单、采购等业务流程。本文将介绍一个基于PHP与MySQL技术栈的B2B订货系统的功能设计与开发流程。 一…

【2024】前端学习笔记17-Vue初体验

学习笔记 1.什么是vue2.vue初体验3.代码拆分释义4.本文新内容1.什么是vue Vue是一个用于构建用户界面的渐进式JavaScript框架。 它专注于视图层,易于集成或与现有项目结合使用,也可以通过其生态系统实现更复杂的单页应用(SPA)。 Vue的核心特点包括响应式数据绑定、组件化开…

java动态代理

静态代理和动态代理 1、代理模式2、静态代理2.1 定义接口2.2 被代理对象实现2.3 代理对象2.4 客户端 3、JDK动态代理3.1 JDK动态代理例子3.1.1 定义接口3.1.2 被代理对象实现3.1.3 实现InvocationHandler接口3.1.4 创建代理对象 3.2 动态代理底层原理3.3 查看生成的代理类 4、C…

多线程的创建方式以及及Thread类详解

目录 一.线程的创建方法&#xff1a;&#xff08;重点&#xff09; 一&#xff1a;继承Thread类 写法一&#xff1a;正常写法 写法二&#xff1a;匿名内部类 二.实现Runnable接口 写法一&#xff1a;正常写法 写法二&#xff1a;匿名内部类 三. 实现 Callable 接口 ​…

408最后冲刺阶段,怎么做题才能考到120+?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 重要性排序如下&#xff1a;真题占据首位&#xff0c;紧随其后的是王道模拟题&#xff0c;王道书与题目则紧随其后&#xff0c;而408统考配套习题&#xff08;高教版&#xff09;与之大致相当。 真题&#xff0c;无疑…

如何对接低价又稳定的影视会员渠道?

对接低价折扣影视会员渠道通常涉及到与影视内容提供商或第三方分销商的合作。以下是一些基本步骤和注意事项&#xff0c;帮助你顺利对接这类渠道&#xff1a; 1. 市场调研 了解市场&#xff1a;研究市场上现有的影视会员服务提供商&#xff0c;包括价格、服务、用户反馈等。确…

crond 任务调度 (Linux相关指令:crontab)

相关视频链接 crontab 进行 定时任务 的设置 概述 任务调度&#xff1a;是指系统在某个时间执行的特定的命令或程序 任务调度的分类&#xff1a; 1.系统工作&#xff1a;有些重要的工作必须周而复始地执行。如病毒扫描等。 2.个别用户可能希望执行某些程序&#xff0c;比如…