day29 回溯part5

2024-02-16 16:12
文章标签 回溯 day29 part5

本文主要是介绍day29 回溯part5,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

491. 非递减子序列

中等
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。
数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况
在这里插入图片描述

在这里插入图片描述

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> findSubsequences(int[] nums) {backtrack(nums, 0);return res;}public void backtrack(int nums[], int start) {if (path.size() >= 2) {res.add(new ArrayList<>(path));}// 借助 set 对 [idx + 1, nums.length - 1] 范围内的数去重Set<Integer> set = new HashSet<>(); //每个循环里都会有一个这个哈希表,不用担心别的分支层的哈希表影响到这个地方的哈希表for (int i = start; i < nums.length; i++) {if (!path.isEmpty() && nums[i] < path.get(path.size() - 1)) {continue; // 如果这个数比上个数小,那就不是递增了}if (set.contains(nums[i])) {continue; // 如果这一层已经用过这个数了,那就砍掉这个分支}set.add(nums[i]);path.add(nums[i]);backtrack(nums, i + 1);path.remove(path.size() - 1);}}
}

46. 全排列

中等
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案
在这里插入图片描述

难点:每次都会延伸出nums.length个分支,只不过都被砍了(见上图),整个算法复杂度很高,所以提示:1 <= nums.length <= 6

class Solution {List<List<Integer>> res = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> permute(int[] nums) {backtrack(nums);return res;}public void backtrack(int[] nums) {if (path.size() == nums.length) {res.add(new ArrayList<>(path));return;}for (int i = 0; i < nums.length; i++) {if (path.contains(nums[i])) {continue;}path.add(nums[i]);backtrack(nums);path.remove(path.size() - 1);}}
}

47. 全排列 II

中等
相关标签
相关企业
给定一个可包含重复数字的序列 ,按任意顺序 返回所有不重复的全排列。

class Solution {List<List<Integer>> res = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();boolean[] used;public List<List<Integer>> permuteUnique(int[] nums) {used = new boolean[nums.length];Arrays.fill(used, false); // 全部填充为falseArrays.sort(nums);backtrack(nums);return res;}public void backtrack(int[] nums) {if (path.size() == nums.length) {res.add(new ArrayList<>(path));return;}for (int i = 0; i < nums.length; i++) {if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {continue; // used[i - 1] == false做得是树层上的去重,因为,当前数等于前一个数,而且前一个数标记为false,说明它已经被使用过了,如果它是true,说明在它的这个树枝里} // used[i - 1] == true 做得是树枝上的去重if (used[i] == false) {path.add(nums[i]);used[i] = true;backtrack(nums);path.remove(path.size() - 1);used[i] = false;}}}
}

难点:这个题,有树枝去重和树层去重两种方式,可以仔细思考,推荐树层去重,更高效

树层去重:used[i - 1] == false
在这里插入图片描述

树枝去重:used[i - 1] == true
在这里插入图片描述

这篇关于day29 回溯part5的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/715063

相关文章

回溯——9.全排列

力扣题目链接 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解题思路 问题建模:题目要求给出一个数组的所有排列组合,属于典型的全排列问题,这可以用回溯法来解决。回溯法通过递归的方式,依次将数组中的每个元素放入排列中,直到生成

风控系统之指标回溯,历史数据重跑

个人博客:无奈何杨(wnhyang) 个人语雀:wnhyang 共享语雀:在线知识共享 Github:wnhyang - Overview 回顾 默认你已经看过之前那篇风控系统指标计算/特征提取分析与实现01,Redis、Zset、模版方法。 其中已经介绍了如何利用redis的zset结构完成指标计算,为了方便这篇文章的介绍,还是在正式开始本篇之前回顾一下。 时间窗口 zset

165-Stamps【回溯】

回溯 给h和k的意思是在k种邮票中选h个邮票 基本的连续邮资问题 15226160 165 Stamps Accepted C++ 0.062 2015-03-27 07:21:37 #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 2

回溯——8.递增子序列

力扣题目链接 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。 示例: 输入: [4, 6, 7, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]] 说明: 给定数组的长度不会超过15。数组中的整数范围是 [-100,100]。给定数组中

【代码随想录|回溯part04】

代码随想录|回溯part04 1、46.全排列2、47.全排列 II3.问题 总结 python 1、46.全排列 46.全排列 class Solution:def permute(self, nums):result = []self.backtracking

代码随想录算法训练营第十九天| 回溯理论、77. 组合、216. 组合总和Ⅲ、17. 电话号码的字母组合

今日内容 回溯的理论基础leetcode. 77 组合leetcode. 216 组合总和Ⅲleetcode. 17 电话号码的字母组合 回溯理论基础 回溯法也叫回溯搜索法,它是一种搜索的方式,而且只要有递归就会有回溯,回溯就是递归的副产品。 回溯说到底并不是什么非常高深的搜索方式,本质上仍然是穷举,穷举所有可能然后选择出我们要的答案。剪枝会使回溯法更加高效一点,但改变不了回溯本质就是穷举

【Java_Spring】Day29 finalize()垃圾回收

finalize()方法 finalize() 是 Java 中 Object 类的一个方法,用于在对象被垃圾回收器回收之前进行清理操作。它是一种资源释放的回调机制,允许开发者在对象销毁前进行一些特定的清理工作,如关闭文件、释放系统资源等。 作用与原理: 垃圾回收器回调:当垃圾回收器(Garbage Collector, GC)确定一个对象没有被任何引用时,它会在对象销毁之前调用该对象的 f

算法打卡 Day28(回溯算法)-组合总数 + 组合总数 Ⅱ+ 电话号码的字母组合

文章目录 Leetcode 17-电话号码的字母组合题目描述解题思路 Leetcode 39-组合总数题目描述解题思路 Leetcode 216-组合总数 Ⅲ题目描述解题思路 Leetcode 17-电话号码的字母组合 题目描述 https://leetcode.cn/problems/letter-combinations-of-a-phone-number/descrip

【递归、回溯专题(三)】记忆化搜索题集

文章目录 1. 斐波那契数2. 不同路径2. 不同路径3. 最长递增子序列4. 猜数字大小II 1. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给定 n

栈回溯

首先必须明确一点也是非常重要的一点,栈是向下生长的,所谓向下生长是指从内存高地址->低地址的路径延伸,那么就很明显了,栈有栈底和栈顶,那么栈顶的地址要比栈底低。对x86体系的CPU而言,其中: ---> 寄存器ebp(base pointer )可称为“帧指针”或“基址指针”,其实语意是相同的。 ---> 寄存器esp(stack pointer)可称为“ 栈指针”。 要知道的是: ---