全排列II

news2025/2/25 21:21:08

1题目

给定一个可包含重复数字的序列 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

2链接

题目链接:47. 全排列 II - 力扣(LeetCode)

视频链接:没看视频回溯算法求解全排列,如何去重?| LeetCode:47.全排列 II_哔哩哔哩_bilibili

3解题思路

这次手撕了一下代码,出现了错误。

错误原因在于used数组的判定条件,没有加if (used[i] == false) { ...... },我反思

其实和上一节课的全排列几乎相同,不过上次是[1 2 3],这次是[ 1 1 2],那就面临重复选取的问题了。难吗?好像也不算难....

上个题(全排列)的图:

注意,第二列取2时,used=[0 1 0]。向下递归再回溯到这个地方时,会出现以下判定情况used[i] == true,对于本题来说没有重复元素所以可以继续进行下去。但是看本题流程图:

同样是第二列,used[i] == true,是不是能继续递归的,不符合题意。但是第一列和第三列used[i] == false (这里i == 1),正常递归。所以要加一条if (used[i] == false) { ...... },如果没有判断语句 if (used[i] == false),则会出现将已经被加入的数字重复添加到排列中的情况。这会导致生成的排列不是全排列,而是有重复数字的排列。

4代码

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking (vector<int>& nums, vector<bool>& used) {
        // 此时说明找到了一组
        if (path.size() == nums.size()) {
            result.push_back(path);
            return;
        }
        for (int i = 0; i < nums.size(); i++) {
            // used[i - 1] == true,说明同一树枝nums[i - 1]使用过
            // used[i - 1] == false,说明同一树层nums[i - 1]使用过
            // 如果同一树层nums[i - 1]使用过则直接跳过
            if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
                continue;
            }
            if (used[i] == false) {
                used[i] = true;
                path.push_back(nums[i]);
                backtracking(nums, used);
                path.pop_back();
                used[i] = false;
            }
        }
    }
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        result.clear();
        path.clear();
        sort(nums.begin(), nums.end()); // 排序
        vector<bool> used(nums.size(), false);
        backtracking(nums, used);
        return result;
    }
};

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

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

相关文章

OpenGauss MOT 实现技术研究

目录 一、概述 二、技术细节和OpenGauss中的实现 1、内存表在内存中的组织 2、事务并发控制算法 3、检查点算法 这篇文档写于2022年6月份&#xff0c;今天打算发到网上&#xff0c;重读时发现可能opengauss mot现在的代码已经有所改变&#xff0c;文中有些代码分支可能已经…

高效远程控制另一台电脑的3种方法,提升工作效率!

如何从我的电脑控制另一台电脑&#xff1f; “我妈妈的电脑出了问题&#xff0c;我需要帮她修理下&#xff0c;但是我不能亲自去进行故障排除。我应该如何从我的电脑远程控制另一台电脑&#xff0c;并提供远程支持&#xff1f;” 如何远程控制另一台电脑&#xff1f;&a…

基于SpringBoot+Vue的学生综合测评系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

http缓存详解

为什么要缓存 通过http协议在客户端和服务端建立连接需要消耗时间&#xff0c;重复访问同一个资源&#xff0c;增加访问服务器数据资源的成本&#xff0c;因此&#xff0c;利用浏览器的缓存机制重用以前获取的数据来优化性能 1、 减少了网络延迟&#xff0c;加快了页面响应速度…

分析全志Tina打包流程,并在buildroot上来实现打包生成tina镜像,支持PhoenixSuit烧写

本文转载自全志在线&#xff1a;https://bbs.aw-ol.com/topic/1532/ 步骤简述 首先记录下官方 tina-sdk 打包的log输出。 bookvirtual-machine:~/D1s-Core/tina-d1-h$ pack ---- PACK_CHIP sun20iw1p1 PACK_PLATFORM tina PACK_BOARD d1-h-nezha PACK_KE…

Vue.js 中的指令和组件详解

Vue.js 中的指令和组件详解 在 Vue.js 中&#xff0c;指令和组件是两个非常重要的概念&#xff0c;它们都可以用来扩展 Vue.js 的功能&#xff0c;但它们之间有一些不同之处。本文将对 Vue.js 中的指令和组件进行详细的介绍&#xff0c;并附上相关的代码示例。 指令 在 Vue.j…

华为OD机试真题 Java 实现【找最小数】【2023 B卷 100分】,附详细解题思路

一、题目描述 给一个正整数num1&#xff0c;计算出新正整数num2&#xff0c;num2为num1中移除N位数字后的结果&#xff0c;需要使得num2的值最小。 二、输入描述 输入的第一行为一个字符串&#xff0c;字符串由0~9字符组成&#xff0c;记录正整数num1&#xff0c;num1的长度…

2.1 网络io、io多路复用select/poll/epoll、基于事件驱动的reactor

目录 一、网络IO请求二、一请求一线程三、IO多路复用——select的通俗理解1、select函数2、accpet函数3、recv函数 四、IO多路复用——poll五、IO多路复用——epoll1、epoll_create2、epoll_ctl3、epoll_wait4、epoll_event5、边缘触发和水平触发&#xff09; 五、区别对比1、s…

axios、跨域与JSONP、防抖和节流

文章目录 一、axios1、什么是axios2、axios发起GET请求3、axios发起POST请求4、直接使用axios发起请求 二、跨域与JSONP1、了解同源策略和跨域2、JSONP&#xff08;1&#xff09;实现一个简单的JSONP&#xff08;2&#xff09;JSONP的缺点&#xff08;3&#xff09;jQuery中的J…

Wwise内存问题

1&#xff09;Wwise内存问题 ​2&#xff09;安卓平台特效显示不一致的问题 3&#xff09;多个矩形小方块组成的地形接缝处有黑线问题 这是第339篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答、社区帖子等技术知识点&#xff0c;助力大…

nginx系列第七篇:结合nginx讨论“惊群”问题

目录 1.什么是惊群 2.linux下socket通信之accept"惊群"现象 3.select/poll/epoll"惊群"现象 4.nginx中的惊群处理 1.什么是惊群 "惊群"是多个进程(线程)阻塞在某个系统调用上等待事件触发&#xff0c;当事件触发后&#xff0c;这些睡眠的进程…

数位dp训练笔记

依稀还记得去年寒假的时候对数位dp的恐惧达到了顶峰&#xff0c;打死也不想做一题&#xff0c;也是怎么学都学不会&#xff0c;甚至板子也只是真的去网上copy了一份&#xff0c;自己也都不理解。&#xff08;羞愧&#xff09; 这个状态持续了一年多&#xff08;羞愧羞愧&#…

Windows操作/文件/设置/DOS 记录

目录 1.系统操作 1.环境变量 2.文件夹操作 1.显示隐藏文件夹 3.DOS窗口 1.DOS窗口中docker切换管理员root /]#身份: docker run -it centos​编辑 4.文件操作 1.图片分辨率无损修改尺寸&#xff08;例1280x800&#xff09; 2.图片修改png/jpg文件后缀类型 1.系统操作 1.…

Python 语句

文章目录 一、条件语句1、顺序语句2、条件语句3、缩进和代码块4、条件语句练习5、空语句 二、循环语句1、while2、for3、break和continue 一、条件语句 1、顺序语句 从上到下依次执行 2、条件语句 Python中使用if else关键字表示条件语句. ①if if expression:do_somethi…

PCB板的Mark点设计对SMT重要性

Mark点也称光学点、基准点&#xff0c;是电路板元器件组装中&#xff0c;PCBA应用于自动贴片机上的位置识别点。 Mark点的选用&#xff0c;直接影响到自动贴片机的贴片效率&#xff0c;因此在设计时&#xff0c;需要设计好Mark点以及其在板内的位置。 Mark点的设计 1、布局位…

String s = new String(“xyz“) 创建了几个对象?

这个问题相信每个学习 java 的同学都不陌生&#xff0c;作为一个经典的面试题&#xff0c;到现在工作这么多年了我真是认为挺操蛋的一个问题&#xff0c;在网上到现在你仍然可以看见很多讨论这个问题的人&#xff0c;其中不乏工作很多年的人都有争论&#xff0c;我认为还是有必…

GreatSQL删除分区慢的跟踪

GreatSQL删除分区慢的跟踪 背景 某业务系统&#xff0c;每天凌晨会删除分区表的一个分区(按天分区)&#xff0c;耗时较久&#xff0c;从最开始的30秒&#xff0c;慢慢变为1分钟&#xff0c;影响到交易业务的正常进行。 在测试环境进行了模拟&#xff0c;复现了删除分区慢的情…

市场火爆!三大发展优势加速汽车零部件行业布局

当前&#xff0c;中国新能源汽车自主品牌崛起&#xff0c;为汽车零部件发展带来新机遇&#xff1b;有别于传统汽车零部件市场&#xff0c;新能源领域&#xff0c;主机厂标准提升&#xff0c;对数字化要求逐渐提高&#xff0c;汽车零部件企业的智能制造异常重要&#xff0c;企业…

二分类结局变量Logistic回归临床模型预测(二)——3. 单因素多因素logistic回归分析及三线表(三)

本节讲的是二分类结局变量的临床模型预测,与之前讲的Cox回归不同,https://lijingxian19961016.blog.csdn.net/article/details/124088364https://lijingxian19961016.blog.csdn.net/article/details/124088364https://lijingxian19961016.blog.csdn.net/article/details/1300…

1929-2022年全球站点的逐月最低气温(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01; 之前我们分享过1929-2022年全球气象站…