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

server/2024/11/13 1:01:58/

刷题记录

  • 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">// 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">// 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">// 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">// java

http://www.ppmy.cn/server/140992.html

相关文章

SSRF〈2〉

SSRF的进阶 1.Gopher协议的利用 1.gopher协议可以通过url指向指定IP端口发送任意内容&#xff0c;模拟大多数TCP协议&#xff0c;是SSRF中的一把利刃。 gopher协议URL&#xff1a; gopher://<host>:<port>/_<url编码的TCP数据> 这个url编码的TCP数据是goph…

华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力3-获取设备位姿

设备位姿描述了物体在真实世界中的位置和朝向。AR Engine提供了世界坐标下6自由度&#xff08;6DoF&#xff09;的位姿计算&#xff0c;包括物体的位置&#xff08;沿x、y、z轴方向位移&#xff09;和朝向&#xff08;绕x、y、z轴旋转&#xff09;。通过AR Engine&#xff0c;您…

开源竞争-大数据项目期末考核

开源竞争&#xff1a; 自己没有办法完全掌握技术的时候就开源这个技术&#xff0c;培养出更多的技术依赖&#xff0c;让更多人完善你的技术&#xff0c;那么这不就是在砸罐子吗&#xff1f;一个行业里面总会有人砸罐子的&#xff0c;你不如先砸还能听个想。 客观现实&#xf…

Java实战项目-基于Spring Boot+vue框架的健康健身追踪系统

大家好&#xff0c;我是stormjun&#xff0c;今天为大家带来的是Java实战项目-基于Spring Bootvue框架的健康健身追踪系统。该系统采用 Java 语言 开发&#xff0c;MySql 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强 &#xff0c;可供大学生实战项目参考使用。 博…

SpringMVC总结 我的学习笔记

SpringMVC总结 我的学习笔记 一、SpringMVC简介1.MVC2.SpringMVC概述3. SpringMVC中的核心组件4.SpringMVC核心架构流程 二、SpringMVC框架实例具体实现使用注解实现 四、数据处理及跳转1.结果跳转方式2.处理器方法的参数与返回值处理提交数据数据显示到前端 五、RestFul风格1.…

wps 运行宏 获取所有的表格

1、 需求&#xff1a; 需要修改word里面的表格样式&#xff0c;表格大概有几百个 2. wps 不支持批量处理&#xff0c;需要使用到宏&#xff0c;下面这个是从其他页面找到的获取所有的表格 测试可以使用。步骤 复制下面的代码到&#xff1a; WPS的工具 --》 开发工具 --》VB编辑…

Stable Diffusion的解读(一)

Stable Diffusion的解读&#xff08;一&#xff09; 文章目录 Stable Diffusion的解读&#xff08;一&#xff09;摘要Abstract一、机器学习部分1. Stable Diffusion的早期工作1.1 从编码器谈起1.2 第一条路线&#xff1a;VAE和DDPM1.3 第二条路线&#xff1a;VQVAE1.4 路线的交…

数据分析-39-时间序列分解之经验小波分解EWT

文章目录 1 时间序列模态分解1.1 模态分解的概念1.2 模态分解的作用1.3 常用的模态分解方法1.4 模态分解的常用库2 经验小波分解EWT2.1 EWT的流程2.2 加载数据集2.2.1 数据重采样2.2.2 原始数据可视化2.3 代码实现EWT3 参考附录1 时间序列模态分解 1.1 模态分解的概念 时间序…