算法力扣刷题记录 八十六【47.全排列 II】

news2024/12/29 16:44:55

前言

回溯章节第12篇。
记录 八十四【46.全排列】初步学习了集合中无重复元素的排列求解。
本文:记录 八十六【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

二、尝试实现

2.1 分析题目,确定方法

  1. 题目说这事求所有的排列,求解排列是回溯理论中介绍的回溯应用之一。所以确定用回溯算法。
  2. 如何实现排列中的去重?
  • 记录 八十四【46.全排列】求解使用一个used数组记录该元素是否在排列中使用过;
  • 记录 六十七【40.组合总和II】去重逻辑,也是用了used数组表示某个元素有没有被选择过;
  • 那么,本题的used数组承担两层含义:一是判断该元素有没有选到排列中;二是用来做“树层去重”
  1. 构造树形结构,以示例一为例:依然是树层去重。排列从0开始遍历。
    在这里插入图片描述

2.2回溯流程【思路】

  1. 确定返回值:用全局变量 vector<vector< int>> result; vector< int> temp; 搜集结果。所以返回值是void。
  2. 确定参数:
  • 需要输入集合:const vector< int>& nums;
  • 需要used数组:vector< bool>& used。表示当前已有的排列中有没有该元素。
  1. 确定终止条件:当temp.size() == nums.size(),temp中已经是一个排列了。就该return。
  2. 确定逻辑:
  • for循环,从0开始,到nums.size()结束;
  • 去重逻辑:if(i > 0 && nums[i] == nums[i-1] && used[i-1] == false),所以先对nums排序;
  • 遍历逻辑:if(used[i] == false) 才执行放入temp,标记更改true;递到下一层;回溯:pop之后,标记used=false;

2.3 代码实现

class Solution {
public:
    vector<vector<int>> result;
    vector<int> temp;
    void backtracking(const vector<int>& nums,vector<bool>& used){
        if(temp.size() == nums.size()){
            result.push_back(temp);
            return;
        }

        for(int i = 0;i < nums.size();i++){
            if(i > 0 && nums[i] == nums[i-1] && used[i-1] == false) continue;
            if(used[i] == false){
                temp.push_back(nums[i]);
                used[i] = true;
                backtracking(nums,used);
                temp.pop_back();
                used[i] = false;
            }
        }
        return;
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        result.clear();
        temp.clear();
        sort(nums.begin(),nums.end());
        vector<bool> used(nums.size(),false);
        backtracking(nums,used);
        return result;
    }
};

三、参考学习

【47.全排列 II】 参考学习链接

  1. “树层去重”+排列:思路和代码和二、尝试实现一致。
  2. 但是指出:去重逻辑if(i > 0 && nums[i] == nums[i-1] && used[i-1] == true)做树枝去重,求排列也可以。
  • 参考用[1,1,1]为例画了树形图,但是从树形图上看,做树枝去重,有点没有理由,但是结果正确。
  • 以数目解释:元素1有3个,说明1只能使用3次。树枝去重能唯一保留下来的是:每个重复的元素都只选了1次。
    在这里插入图片描述
  • 自然:树层去重更好理解,效率高;可以延续组合去重的逻辑思维

总结

在这里插入图片描述
(欢迎指正,转载标明出处)

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

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

相关文章

VirtualBox安装Oracle Linux 7.9全流程

1.准备工作 1.1 VirtualBox下载 下载地址1&#xff1a; Downloads – Oracle VM VirtualBoxhttps://www.virtualbox.org/wiki/Downloads 下载地址2&#xff1a; https://www.oracle.com/virtualization/virtualbox/ 选择以上的任意一个地址都可下载到。 1.2 Oracle Linux 操作…

购物车系统设计方案

背景 在电商领域&#xff0c;购物车&#xff08;Shopping Cart&#xff09;扮演着至关重要的角色&#xff0c;它是连接用户浏览商品与最终完成购买行为的桥梁。 从两个视角来阐述&#xff0c;作为ToC的购物车&#xff0c;存在的意义&#xff1a; 从用户角度&#xff1a; 收…

ssm大学生实习管理系统的设计与实现-计算机毕业设计源码45837

摘 要 在信息时代&#xff0c;随着网络的快速发展&#xff0c;各个行业都离不开信息的处理。在这样的背景下&#xff0c;高校需要以学生管理信息为导向&#xff0c;并与学生实习的持续创新相结合。因此&#xff0c;设计一个高校学生实习管理系统就显得非常必要。 该系统采用了B…

维基百科向量搜索;简单易用的GraphRAG实现;友好的人工智能助手;AI的音乐多模态

✨ 1: Semantic Search on Wikipedia 维基百科向量搜索 为了证明 Upstash Vector 的可扩展性&#xff0c;Upstash在一个数据库中以 11 种语言&#xff08;144m 向量&#xff09;索引了整个维基百科 ◆ 超过700GB的数据 ◆ 快速语义搜索 ◆ 与维基百科聊天 为您提供了一款可…

Unity--AssetBundle AB包管理器

1.简介 AB包&#xff08;AssetBundle&#xff09;是Unity中用于资源管理的一种机制&#xff0c;它允许开发者将多个文件&#xff08;如纹理、模型、音频等&#xff09;打包成一个单独的文件&#xff0c;以便于在游戏运行时动态加载和卸载。 但是现在出现了最新的Addressable来…

Python匿名函数之lambda表达式使用详解

概要 在Python编程中,函数是组织代码和实现逻辑的基础单元。除了使用def关键字定义命名函数外,Python还提供了创建匿名函数的方式,即lambda表达式。lambda表达式是一种简洁的函数定义方式,通常用于需要简短函数的场景。本文将详细介绍Python匿名函数的概念、使用场景及其高…

基于51单片机的双机通信控制系统proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1Y4wOJKOYf2E4JeEktyKdTw 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…

微分方程(Blanchard Differential Equations 4th)中文版Section3.1

3.1 PROPERTIES OF LINEAR SYSTEMS AND THE LINEARITY PRINCIPLE(线性系统问题与线性算子原理) 在第2章中,我们专注于研究微分方程组的定性和数值方法。之所以这样做,是因为我们很少能找到具有两个或更多个因变量的系统的明确解公式。唯一的例外是线性系统。在本章中,我们…

Linux·权限与工具-yum与vim

1. Linux软件包管理器 yum 1.1 什么是软件包 在Linux下安装软件&#xff0c;一个通常的办法是下载到程序的源代码&#xff0c;并进行编译&#xff0c;得到可执行程序。但这样做太麻烦了&#xff0c;于是有些人把一些常用的软件提前编译好&#xff0c;做成软件包(可以理解成Win…

12.2 使用prometheus-sdk向pushgateway打点

本节重点介绍 : 使用golang sdk打prometheus4种指标&#xff0c;推送到pushgateway gauge、counter、histogram、summary的初始化4种类似的设置值的方法推送到pushgateway的方法 prometheus配置采集pushgateway&#xff0c;grafana上配大盘 golang-sdk 项目地址 https://git…

【图数据库系列】Cypher查询语句:常用语法指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

HTML常用标签和CSS的运用,以及使用HTML做一个简历

目录 1.HTML标签 1.1 文档结构标签 1.2 文本格式标签 1.3 列表标签 1.4 链接和媒体标签 1.5 表格标签 1.6 表单标签 1.7 分区和布局标签 1.8 元数据标签 2.css样式 2.1 字体样式 2.2 文本样式 2.3 背景样式 2.4 边框样式 2.5 间距样式 2.6 宽度和高度 2.7 显示…

三种简单排序:插入排序、冒泡排序与选择排序 【算法 05】

三种简单排序&#xff1a;插入排序、冒泡排序与选择排序 在编程中&#xff0c;排序算法是基础且重要的知识点。虽然在实际开发中&#xff0c;我们可能会直接使用标准库中的排序函数&#xff08;如C的std::sort&#xff09;&#xff0c;但了解并实现这些基础排序算法对于理解算法…

JS编程中有哪些常见的编程“套路”或习惯

JS编程中有哪些常见的编程“套路”或习惯 从个人的编程经验来看&#xff0c;不管你是前端JS编程还是后端Java编程&#xff0c;在一些习惯上基本是通用的。就是你编写的JS代码必须要功能完善且易于阅读易于维护。那么这里整理一下JS编程过程中一些比较行之有效的编程习惯。 函数…

3.Default Constructor的构造操作

目录 1. 问题引入 2. 4种implicitly声明的default constructor 1. 问题引入 “default constructors......在需要的时候被编译产生出来”。关键词是“在需要的时候”&#xff0c;被谁需要&#xff0c;做什么事情&#xff1f;看看下面的代码&#xff0c;然后梳理下思路。 cl…

章二十、Servlet ——

一、 web开发概述 所谓web开发,指的是从网页中向后端程序发送请求,与后端程序进行交互&#xff0c;流程如下&#xff1a; ● 什么是服务器&#xff1f; Web服务器是指驻留于因特网上某种类型计算机的程序&#xff0c;它可以向浏览器等Web客户端提供文档&#xff0c;也可以放置…

算法的学习笔记—反转链表(牛客JZ24)

&#x1f600;前言 在算法面试中&#xff0c;链表问题是一个常见的考点&#xff0c;而反转链表更是其中的经典题目之一。本篇文章将通过具体的代码实现和思路解析&#xff0c;带你深入理解反转链表的解法。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 &#x1f600;反…

【前端】NodeJS:项目上线

文章目录 1 项目上线1.1 搭建本地仓库1.1.1 初始化仓库1.1.2 全局忽略1.1.3 提交 1.2 连接远程仓库1.2.1 新建仓库1.2.2 复制地址1.2.3 添加远程存储库 1.3 发布项目 2 配置HTTPS证书2.1 HTTPS2.2 操作流程: 1 项目上线 1.1 搭建本地仓库 1.1.1 初始化仓库 1.1.2 全局忽略 1.…

福泰轴承股份有限公司进销存系统pf

TOC springboot413福泰轴承股份有限公司进销存系统pf 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#…

Idea里配置Maven版本

一、安装Maven 1. 官网下载maven地址&#xff1a; Maven – Download Apache Maven Binary是可执行版本&#xff0c;已经编译好可以直接使用。 Source是源代码版本&#xff0c;需要自己编译成可执行软件才可使用。tar.gz和zip两种压缩格式,其实这两个压缩文件里面包含的内容是…