【代码随想录算法训练营Day29】 491.递增子序列;46.全排列;47.全排列 II

news2024/11/20 4:34:23

文章目录

  • ❇️Day 29 第七章 回溯算法 part05
    • ✴️今日内容
    • ❇️491.递增子序列
      • 自己的思路
      • 随想录思路
      • 自己的代码
    • ❇️46.全排列
      • 思路
      • 代码
      • 流程
    • ❇️47.全排列 II
      • 思路
      • 代码

❇️Day 29 第七章 回溯算法 part05

✴️今日内容

  • 491.递增子序列
  • 46.全排列
  • 47.全排列 II

❇️491.递增子序列

  • 本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。
  • 题目链接:https://leetcode.cn/problems/non-decreasing-subsequences/
  • 视频讲解:https://www.bilibili.com/video/BV1EG4y1h78v
  • 文章链接:https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html

自己的思路

  1. 先给数组排序
  2. 使用visited数组判断相同数是否被访问过
  3. 当nums长度大等于2时添加到res中
  4. 去重:因为不能排序,所以去重更复杂了,用visited不能通过了

随想录思路

在这里插入图片描述

所以要从集合中判断当前数在前面的集合中有没有出现过,所以自然想到哈希表,

  1. 创建一个set
  2. 每取一个元素就把元素放到set中

自己的代码

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> findSubsequences(int[] nums) {
        dfs(nums, 0);
        return res;
    }
    public void dfs(int[] nums, int start){
        if(path.size() >= 2){
            res.add(new ArrayList<>(path));
        }
        //子集问题可以省掉终止条件因为当start >= nums.length时不会进入for循环
        //if(start >= nums.length) return;
        //在每一个for循环前定义一个set来表示已经被选过数的集合
        HashSet<Integer> usedSet = new HashSet<>();
        for (int i = start; i < nums.length; i++) {
            if(!path.isEmpty() && path.get(path.size() - 1) > nums[i] || usedSet.contains(nums[i])) {
                continue;
            }
            usedSet.add(nums[i]);
            path.add(nums[i]);
            dfs(nums, i + 1);
            path.removeLast();
        }
    }
}

❇️46.全排列

  • 本题重点感受一下,排列问题 与 组合问题,组合总和,子集问题的区别。 为什么排列问题不用 startIndex
  • 题目链接:https://leetcode.cn/problems/permutations/
  • 视频讲解:https://www.bilibili.com/video/BV19v4y1S79W
  • 文章链接:https://programmercarl.com/0046.%E5%85%A8%E6%8E%92%E5%88%97.html

思路

先固定数组中的一个值,然后再固定排列剩下的值
所以需要一个参数来表示数组中的数有没有被固定

代码

public static List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        dfs(nums, new boolean[nums.length], new LinkedList<>(), res);
        return res;
}
public static void dfs(int[] nums, boolean[] visited, LinkedList<Integer> stack, List<List<Integer>> res){
        //结束条件
        if(stack.size() == nums.length){
                res.add(new ArrayList<>(stack));
                return;
        }
        //遍历nums数组,发现没有被使用的数字,则将其标记为使用,并加入stack
        for (int i = 0; i < nums.length; i++) {
                if (!visited[i]) {
                        stack.push(nums[i]);
                        visited[i] = true;
                        dfs(nums, visited, stack, res);
                        //回溯
                        visited[i] = false;
                        stack.pop();
                }
        }
}

流程

[图片]

❇️47.全排列 II

  • 本题 就是我们讲过的 40.组合总和II 去重逻辑 和 46.全排列 的结合,可以先自己做一下,然后重点看一下 文章中 我讲的拓展内容。 used[i - 1] == true 也行,used[i - 1] == false 也行
  • 题目链接:https://leetcode.cn/problems/permutations-ii/
  • 视频讲解:https://www.bilibili.com/video/BV1R84y1i7Tm
  • 文章链接:https://programmercarl.com/0047.%E5%85%A8%E6%8E%92%E5%88%97II.html

思路

规定:遇到相同的几个数,先固定第一个,再固定第二个
这样做就需要给数组排个序使相同的数字挨在一起
这种操作也叫剪枝

代码

public static List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        dfs(nums, new boolean[nums.length], new LinkedList<>(), res);
        return res;
}
public static void dfs(int[] nums, boolean[] visited, LinkedList<Integer> stack, List<List<Integer>> res){
        //结束条件
        if(stack.size() == nums.length){
                res.add(new ArrayList<>(stack));
                return;
        }
        //遍历nums数组,发现没有被使用的数字,则将其标记为使用,并加入stack
        for (int i = 0; i < nums.length; i++) {
                //▶️找出重复的数字,且上一个与当前数字相等的数字没有被固定则跳过当前循环
                if(i > 0 && nums[i] == nums[i - 1] && !visited[i - 1]){
                        continue;
                }
                if (!visited[i]) {
                        stack.push(nums[i]);
                        visited[i] = true;
                        dfs(nums, visited, stack, res);
                        //回溯
                        visited[i] = false;
                        stack.pop();
                }
        }
}

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

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

相关文章

低压MOS在步进电机驱动器上的应用-REASUNOS瑞森半导体

一、前言 步进电机驱动器是一种用于控制步进电机运动的装置&#xff0c;它是将控制信号转换成步进电机可以识别的控制电压或电流的电路。它在工业自动化领域有着广泛的应用&#xff0c;如机器人、印刷机、木工机床、喷绘机等。步进电机驱动器的组成结构主要由以下部分&#xf…

《C缺陷和陷阱》-笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、理解函数声明 1.(*(void(*)( ))0)( ); 2.signal 函数接受两个参数&#xff1a; 3.使用typedef 简化函数声明&#xff1a; 二、运算符的优先级…

面试经典150题【61-70】

文章目录 面试经典150题【61-70】61.旋转链表86.分隔链表104. 二叉树的最大深度100.相同的树226.翻转二叉树101.对称二叉树105.从前序与中序遍历序列构造二叉树106.从后序和中序遍历序列构造二叉树117.填充每个节点的下一个右侧节点指针II114.二叉树展开为链表 面试经典150题【…

修复 因 fstab 中UUID 错误导致系统无法正常工作的问题

操作系统&#xff1a; PVE 8.0 /debian 12 &#xff08;bookworm&#xff09; 问题症状&#xff1a;可以正常启动进入系统&#xff0c;但是系统盘以只读方式挂载 问题原因&#xff1a;/etc/fstab 中引导区的UUID 被错误修改导致 解决方法&#xff1a; 重启系统&#xff0c;在…

QT:用opencv的KNN识别图片中的LED数字(一)

前言 一款功能测试的软件demo,使用了QT作为界面,主要使用了opencv的KNN识别,使用gstreamer作为管道,用来打开图片。后期会写一篇打开摄像头实时识别的文章。 (正在写,未完成,稍候) 效果一预览: 效果二预览: 效果三预览: 正在写。。。 设计思路 1. 软件UI设…

吴恩达深度学习笔记:深度学习引言1.1-1.5

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第一周&#xff1a;深度学习引言(Introduction to Deep Learning)1.1 欢迎(Welcome)1.2 什么是神经网络&#xff1f;(What is a Neural Network)1.3 神经网络的监督学习(Supervised Learning …

【C++】C++模板基础知识篇

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 3. 类模板3.1 类模板的定义格式3.2 类模板的实例化…

Trans论文复现:考虑源荷不平衡性的微电网鲁棒定价方法程序代码!

适用平台&#xff1a;MatlabYalmipCplex/Gurobi 程序针对目前微电网中高比例新能源发电的波动性和间歇性&#xff0c;提出了考虑源荷不平衡特性的微电网鲁棒定价方法&#xff0c;综合考虑电力市场边际收益和边际成本&#xff0c;利用价格波动来平衡电源和负荷。程序算例丰富、注…

腾讯云轻量 2核2G4M新用户首购活动,99续费同价来了!!

阿里云199一年续费同价&#xff0c;腾讯云99一年续费同价&#xff0c;平台卷起来&#xff0c;对用户的角度来说&#xff0c;真的是香麻了~ 腾讯云新春采购节&#xff0c;2核2G4兆的基础配置&#xff0c;新官方直接放大招&#xff0c;99一年&#xff0c;活动期间内&#xff0c;…

EXSI create datastore

文章目录 1. 简介2. 清空磁盘3. 删除表4. 创建database 1. 简介 在 ESXi 环境中创建数据存储(Datastore)的步骤如下: 登录 vSphere Web Client 打开 Web 浏览器,输入 ESXi 主机或 vCenter Server 的 IP 地址,使用有权限的账户登录。 在 ESXi 环境中创建数据存储(Datastore)…

二、TensorFlow结构分析(4)

TF数据流图图与TensorBoard会话张量Tensor变量OP高级API 目录 1、变量 2、高级API 1、变量 2、高级API

【Kafka系列 07】Kafka 如何保证消息不丢失

一、Kafka 消息不丢失的边界 一直以来&#xff0c;很多人对于 Kafka 丢失消息这件事情都有着自己的理解&#xff0c;因而也就有着自己的解决之道。在讨论具体的应对方法之前&#xff0c;我觉得我们首先要明确&#xff0c;在 Kafka 的世界里什么才算是消息丢失&#xff0c;或者…

华为云开年采购季Web及移动App上云体验,助力软件行业创新发展

随着云化、智能化浪潮的进一步深入&#xff0c;越来越多的应用软件开发商选择将核心产品从本地IDC机房搬迁到公有云上。但同时&#xff0c;软件开发商们也非常在意公有云厂商的可靠性与安全性&#xff0c;希望能够选择一家更加稳定可靠的云服务商&#xff0c;确保自身业务的连续…

02极简LLM逻辑与PyTorch快速入门

文章目录 02极简LLM逻辑与PyTorch快速入门极简LLM逻辑PyTorch环境安装&#xff08;重要&#xff0c;不难&#xff09;PyTorch 主要概念Tensors张量张量常见的形式&#xff1a;scalar、vector、matrix、n-dimensinal张量初始化张量参数&#xff1a;shape、datatype、device张量运…

从huggingface下载模型像本地加载但是UnicodeDecodeError

我自己是在Linux下出现了这个问题 原文&#xff1a;https://github.com/huggingface/transformers/issues/13674 The path for the AutoModel should be to a directory pointing to a pytorch_model.bin and to a config.json. Since you’re pointing to the .bin file dire…

论文笔记:Efficient Bootstrapping for Confidential Transactions

EcoBoost: Efficient Bootstrapping for Confidential Transactions 设计了一种被称为EcoBoost的新方法&#xff0c;以提高支持机密交易的区块链的引导效率。具体来说&#xff0c;利用随机抽样来验证高概率保密交易的正确性。因此&#xff0c;与事务数量相比**&#xff0c;验证…

Promise async await

简介&#xff1a;回调 JS会提供很多函数&#xff0c;允许异步行为。换句话说&#xff0c;现在开始执行的行为。但它们会在稍后完成。异步执行某项功能的函数应该提供一个 callback 参数用于在相应事件完成时调用。处理Error&#xff1a; 加载成功时&#xff0c;它会调用 callb…

Z Potentials | 星爵,他的征途不止向量数据库

纵观过去几十年的科技发展史&#xff0c;每一代新的技术架构的出现往往都伴随着新的数据范式的出现&#xff0c;也催生了多家百亿到千亿美金数据平台的诞生。如果说 2023 年科技领域的关键词是 LLM&#xff0c;那么数据库领域的关键词一定非向量数据库莫属。向量数据库是一种专…

我们是如何测试人工智能产品的

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术已经成为我们生活中不可或缺的一部分。然而&#xff0c;要构建出可信赖的AI系统并非易事。这需要我们不仅深入理解人工智能的核心原理&#xff0c;还需要将这些理论知识应用到实际场景中。 为了帮助大家系…

一个不错的空间视频收集论坛

该网站收录了来自世界各地的空间视频、空间照片和全景照片,以突出令人惊叹的 Apple Vision Pro 的功能。 网站地址: