【算法刷题day29】Leetcode:491. 非递减子序列、46. 全排列、47. 全排列 II

news/2024/10/18 18:25:10/

文章目录

    • Leetcode 491. 非递减子序列
      • 解题思路
      • 代码
      • 总结
    • Leetcode 46. 全排列
      • 解题思路
      • 代码
      • 总结
    • Leetcode 47. 全排列 II
      • 解题思路
      • 代码
      • 总结

草稿图网站
java的Deque

Leetcode 491. 非递减子序列

题目:491. 非递减子序列
解析:代码随想录解析

解题思路

大题差不多的回溯。
当元素大于等于两个的时候要记录一下;使用HashSet来去重(树枝上可以重复,树层上不能重复)

代码

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

总结

暂无

Leetcode 46. 全排列

题目:46. 全排列
解析:代码随想录解析

解题思路

使用一个used数组来记录是否遍历。

代码

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> paths = new ArrayList<>();boolean[] used;private void backtracking(int[] nums) {if (paths.size() == nums.length) {res.add(new ArrayList<>(paths));return;}for (int i = 0; i < nums.length; i++) {if (used[i] == true)continue;paths.add(nums[i]);used[i] = true;backtracking(nums);paths.remove(paths.size() - 1);used[i] = false;}}public List<List<Integer>> permute(int[] nums) {used = new boolean[nums.length];backtracking(nums);return res;}
}

总结

暂无

Leetcode 47. 全排列 II

题目:47. 全排列 II
解析:代码随想录解析

解题思路

使用之前的模板去重:

 if (i > 0 && nums[i] == nums[i-1] && used[i-1] == false)continue;

加上used[i-1]==false的原因是,如果used[i-1]==false则是同一树层;如果used[i-1]==true则是新的树枝。

代码

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> paths = new ArrayList<>();boolean[] used;private void backtracking(int[] nums) {if (paths.size() == nums.length) {res.add(new ArrayList<>(paths));return;}for (int i = 0; i < nums.length; i++) {if (i > 0 && nums[i] == nums[i-1] && used[i-1] == false)continue;if (used[i] == true)continue;paths.add(nums[i]);used[i] = true;backtracking(nums);paths.remove(paths.size() - 1);used[i] = false;}}public List<List<Integer>> permuteUnique(int[] nums) {used = new boolean[nums.length];Arrays.sort(nums);backtracking(nums);return res;}
}

总结

暂无


http://www.ppmy.cn/news/1428443.html

相关文章

头歌实训作业答案c++

由于“头歌实训作业答案C”这个表述可能指的是某个特定课程或机构的C编程作业答案&#xff0c;通常这类作业答案不会公开分享&#xff0c;因为这涉及到版权和学术诚信的问题。但我可以提供一些C编程的通用指导和资源&#xff0c;帮助你完成实训作业。 ### C编程基础 1. **变量…

07-ESP timer

ESP32-S3 ESPTIMER 介绍 ESP Timer是ESP32-S3的一个强大功能&#xff0c;它允许创建软件定时器并在超时时调用它们的回调函数。这对于需要执行延迟或周期性操作的用户软件非常有用&#xff0c;例如延迟设备启动/停止或周期性采样传感器数据。 对于需要较好实时性能&#xff…

【Java】HashMap、HashTable和ConcurrentHashMap的区别

文章目录 区别一、HashMap1.1基本定义与特性1.2工作原理与实现1.3常用方法1.4性能与优化 二、HashTable三、ConcurrentHashMap3.1基本特点3.2实现原理3.3常用方法3.4适用场景3.5性能优化 HashTable、HashMap和ConcurrentHashMap之间的区别主要体现在线程安全、继承关系与实现接…

网络基础(二)——传输层

1、再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序; 在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -n查看); 1.1、端口号…

数字逻辑课程实验环境配置与使用说明

文章目录 I.虚拟机搭建1.1 Vmware安装1.2 Win XP安装1.3 xftp7安装 I. Quartus II安装II. 使用说明2.1 新建工程2.2 在工程中加入代码2.3 代码编译波形仿真 I.虚拟机搭建 1.1 Vmware安装 Vmware17安装教程 1.2 Win XP安装 Win XP安装教程 1.3 xftp7安装 给虚拟机添加FTP …

投入产出表的分析要点有哪些

投入产出分析是利用投入产出表、投入产出系数和投入产出模型&#xff0c;对国民经济各部门之间的技术经济联系和影响进行分析的一种经济数据分析方法。 一、什么是投入产出表 我国的投入产出表是描述国民经济中各种产品的来源与使用去向的棋盘式平衡表 , 是产品部门 产品部门…

Smart Link + Monitor Link 实现二层链路故障判断与主备自动切换

一、适用场景&#xff1a; 1、企业中有二层需要提高可靠性业务的主备链路&#xff1b;具备快速收敛性能&#xff0c;收敛速度可达到亚秒级&#xff0c;实现高效可靠。 2、运行的业务对可靠性有要求&#xff0c;对应的网络拓扑不适宜修改为三层链路&#xff0c;只能在原二层链路…