每日刷题|回溯法解决全排列问题

news2024/9/21 0:36:40

                                        食用指南:本文为作者刷题中认为有必要记录的题目

                                        前置知识回溯法经典问题之组合

                                       ♈️今日夜电波:爱人错过—告五人

                                                                1:11 ━━━━━━️💟──────── 4:52
                                                                    🔄   ◀️   ⏸   ▶️    ☰ 

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍 


目录

回溯法的理解

💮 一、全排列

🌺二、全排列II


回溯法的理解

 本文参考了一位大佬的题解,详细的介绍了回溯法:链接

上一篇刷题文: 回溯法经典问题之子集

        记住一句话:for循环横向遍历,递归纵向遍历,回溯不断调整结果集。 这句话将从始至终贯穿我们对于以上问题的回溯解决办法。 


💮 一、全排列

题目链接:46. 全排列

题目描述:

       给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]
输出:[[1]]

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

本题思路:

        首先:采用经典的“回溯三部曲”:

        1、定义两个全局变量,一个用来存放符合条件单一结果(path),一个用来存放符合条件结果的集合(result)。

        2、回溯的主体,回溯终止条件。path保存一组数据,每次遍历到叶子节点,再插入到result中,并且回溯到上一个节点。

        3、单层搜索的过程。for循环用来横向遍历,递归的过程是纵向遍历。

       根据题意我们做出一定的改动:

        我们额外定义一个bool类型的used用于确定每一个节点是否使用过,以此来解决重复插入的问题,并且也可以通过used对应的位置是否为false来确定是否进行后续操作。一句话概括就是:只有当used[i]==0时才去进行后续操作。

        一图让你了解~以{1,2,3}为例

class Solution {
private:
vector<int> path;
vector<vector<int>> result;

void trackback(vector<int>& nums,vector<bool>& used)
{
    if(path.size()==nums.size())
    {
        result.push_back(path);
    }

    for(int i=0;i<nums.size();i++)
    {
        if(used[i]!=1)
        {
            path.push_back(nums[i]);
            used[i]=1;
            trackback(nums,used);
            used[i]=0;
            path.pop_back();
        }

    }
}
public:
    vector<vector<int>> permute(vector<int>& nums) {
        path.clear();
        result.clear();
        vector<bool> used;
        used.resize(nums.size());
        sort(nums.begin(),nums.end());
        trackback(nums,used);
        return result;
    }
};


🌺二、全排列II

题目链接:47. 全排列 II

题目描述:

       给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

输入:nums = [1,1,2]
输出:
[[1,1,2],
 [1,2,1],
 [2,1,1]]

示例 2:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

提示:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

本题思路:

        本题实际上为上一题的拓展题目,基本上的思路跟上一题是的没什么区别的,但是由于此题中的元素是可以重复的,那我们就不能按照上一题只需要全部遍历一遍节点即可,在这里,我们需要加入剪枝操作,以此来解决重复选取问题。一句话概括就是:同一树枝上可以选取,但是同一树层上不可以选取!

        即:添加这段判断语句{i>0&&nums[i-1]==nums[i]&&used[i-1]==0}来筛选重复的元素!

        一图让你了解~以{1,1,2}为例

class Solution {
private:
vector<int> path;
vector<vector<int>> result;

void trackback(vector<int>& nums,vector<bool>& used)
{
    if(path.size()==nums.size())
    {
        result.push_back(path);
        return;
    }

    for(int i=0;i<nums.size();i++)
    {
        if(i>0&&nums[i-1]==nums[i]&&used[i-1]==0)
        continue;

          if (used[i] != 1)
            {
                path.push_back(nums[i]);
                used[i] = 1;
                trackback(nums, used);
                used[i] = 0;
                path.pop_back();
            }
    }
}
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        path.clear();
        result.clear();
        vector<bool> used;
        used.resize(nums.size());
        sort(nums.begin(),nums.end());
        trackback(nums,used);
        return result;
    }
};


                感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!  

                                 

                                                                 给个三连再走嘛~      

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

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

相关文章

商业智能必备利器,帆软、powerBI替代工具

随着商业智能领域的发展&#xff0c;越来越多的企业开始意识到数据对于业务发展的重要性。而在这个过程中&#xff0c;BI&#xff08;商业智能&#xff09;工具成为了企业进行数据分析、决策支持的必备利器。然而&#xff0c;市场上BI工具种类繁多&#xff0c;每个工具都有其独…

机器学习笔记之最优化理论与方法(八)无约束优化问题——常用求解方法(中)

机器学习笔记之最优化理论与方法——基于无约束优化问题的常用求解方法[中] 引言回顾&#xff1a;最速下降算法的缺陷经典牛顿法基本介绍经典牛顿法的问题经典牛顿法的优点与缺陷经典牛顿法示例 修正牛顿法介绍拟牛顿法拟牛顿法的算法过程 矩阵 B k 1 \mathcal B_{k1} Bk1​的…

从软件工程师角度聊聊 Kubernetes

作为软件工程师&#xff0c;我们应该熟悉 K8s&#xff0c;尽管它有点像 DevOps&#xff0c;但它能让我们更好地了解幕后发生的事情&#xff0c;让我们与部署工作更密切相关&#xff0c;更有责任感。本文将从软件工程师的角度探讨 Kubernetes (K8s)&#xff0c;我们将介绍其动机…

【NoSQL】redis之持久化(RDB、AOF)

一、Redis 高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证…

LeetCode刷题笔记【30】:动态规划专题-2(不同路径、不同路径 II)

文章目录 前置知识62.不同路径题目描述解题思路代码 63. 不同路径 II题目描述障碍信息传递法(比较复杂)被障碍物阻挡后直接清空计数法(更简洁) 总结 前置知识 参考前文 参考文章&#xff1a; LeetCode刷题笔记【29】&#xff1a;动态规划专题-1&#xff08;斐波那契数、爬楼梯…

【代码随想录】Day 45 动态规划7 (爬楼梯(进阶)、零钱兑换、完全平方数)

爬楼梯&#xff08;进阶&#xff09; https://leetcode.cn/problems/climbing-stairs/ 零钱兑换 https://leetcode.cn/problems/coin-change/ 完全平方数 https://leetcode.cn/problems/perfect-squares/

GE IS220PAICH2A 336A4940CSP11 数字量输入模块产品应用领域

GE IS220PAICH2A 336A4940CSP11 是一款数字量输入模块&#xff0c;通常用于工业自动化和控制系统中&#xff0c;用于监测和采集数字输入信号。这种类型的模块可以在各种应用领域中发挥作用&#xff0c;以下是一些可能的应用领域&#xff1a; 工业过程控制&#xff1a; GE IS220…

九个月内累计被罚1.3亿元,知网为何屡触法网

大数据产业创新服务媒体 ——聚焦数据 改变商业 9月6日&#xff0c;国家网信办根据《个人信息保护法》作出顶格处罚&#xff0c;对中国知网处以5000万元的罚款。 国家网信办的调查发现&#xff0c;知网运营的手机知网、知网阅读等14款APP存在违反必要原则收集个人信息、未经同…

怎么把照片变成视频?分享个简单的制作方法

在现代社交网络中&#xff0c;图文视频已成为非常流行的视觉语言。由于图文视频具有强烈的视觉吸引力和交互性&#xff0c;它们已成为许多人在社交媒体上分享自己的生活和经历的首选方式。以下是制作图文视频的步骤&#xff1a; Step 1 首先&#xff0c;我们需要选取一些照片来…

图片上的字怎么去掉?尝试下这几种简单操作方法

在设计中&#xff0c;图片通常被用来传达信息或增强视觉效果。然而&#xff0c;有时候图片中的文字可能会干扰到内容的阅读或降低整体设计的美感。除此之外&#xff0c;如果图片中的文字已经在其他地方出现过了&#xff0c;比如在正文或标题中&#xff0c;那么重复使用文字会让…

基于轻量级神经网络GhostNet开发构建的200种鸟类细粒度识别分析系统

最近项目需要用到轻量级的网络模型&#xff0c;后期考虑进一步的剪枝和量化达到加速推理的目的&#xff0c;正好有时间就想着基于实际的数据集来开发构建项目做测试&#xff0c;本文的核心目的就是选定轻量级神经网络模型GhostNet来开发构建细粒度鸟类识别系统&#xff0c;首先…

MySQL服务关闭开机自启,改成手动启动状态

最近在写前端&#xff0c;所以就先把后端数据库禁用或手动启动吧。防止浪费太多内存或资源。一般就之前损坏了的数据库就禁用吧&#xff0c;其他最近不常用的服务就没必要开机自启动吧&#xff0c;毕竟电脑只有一台&#xff0c;不想学习想用电脑来玩的话就讲工作服务从开机自启…

数字出版软件系统开发

数字出版涵盖了广泛的内容&#xff0c;从电子书到数字杂志、在线期刊和互动教育教材等。为了实现这些数字出版物&#xff0c;有许多不同类型的软件系统可供使用&#xff0c;每种都有自己的特点和功能。以下是一些常见的数字出版软件系统以及它们主要实现的功能&#xff0c;希望…

国标视频云服务EasyGBS国标视频平台设备录像下载文件为ps格式,如何改为MP4格式?

EasyGBS是基于国标GB/T28181协议的视频云服务平台&#xff0c;不仅支持无缝、完整接入内网或者公网的国标设备&#xff0c;在输出上&#xff0c;提供RTSP、RTMP、FLV、HLS、WebRTC等多种格式视频流的分发服务&#xff0c;实现全平台、全终端输出。 有用户反馈&#xff0c;在使用…

ubuntu 扩展内存挂载

一般新建虚拟机时&#xff0c;系统默认的空间是20G&#xff0c;但是当我们搭建一些环境之后&#xff0c;需要解压一些稍微大点的源码时内存可能不够用了&#xff0c;这时我们需要扩展内存。 一、硬盘扩展 首先&#xff0c;关闭虚拟机&#xff0c;在虚拟机设置中将硬盘容量扩展…

PMP认证的用处是什么?做哪些工作需要?

PMP是项目管理证书&#xff0c;是PMI组织&#xff0c;严格评估项目管理人员知识技能是否具有高品质的资格认证考试。随着在国内传播和影响力的增加&#xff0c;如今在各大招聘平台去看项目经理之类的职位&#xff0c;大多数要求会有“PMP证书优先”。在一些大型企业&#xff0c…

【开源三方库】crypto-js加密算法库的使用方法

OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&#xff09;三方库&#xff0c;是经过验证可在OpenHarmony系统上可重复使用的软件组件&#xff0c;可帮助开发者快速开发OpenHarmony应用。如果是发布到开源社区&#xff0c;称为开源三方库&#xff0c;开发者可以通过访问…

antd中 a-table表格组件跨页勾选,数据回显勾选的问题

踩坑&#xff1a;a-table翻页勾选数据丢失&#xff0c;数据回显勾选 需求&#xff1a;input框显示勾选的所有数据里面的name组成的字符串&#xff0c;点击后面的图标弹出弹框&#xff0c;并且之前选择的数据需要回显勾选。如下图所示 <a-card :bordered"false"&…

苹果笔有必要买吗?ipad可以用的手写笔

众所周知&#xff0c;现在网上越来越多平替电容笔的出现&#xff0c;无论是价格和功能&#xff0c;几乎都很接近。很多小伙伴不知如何下手&#xff0c;不知道如何从众多品牌中挑选出适合自己的电容笔&#xff0c;今天我为大家总结一下网上几款热销&#xff0c;平价的国货品牌电…

【计算机基础知识6】跨域问题及解决方案

目录 前言 一、什么是跨域问题&#xff1f; 二、为什么会出现跨域问题&#xff1f; 三、常见的跨域解决方法 1. JSONP&#xff08;JSON with Padding&#xff09; 2. CORS&#xff08;跨域资源共享&#xff09; 3. 代理服务器 4. postMessage() 前言 跨域是前端开发中经…