当前位置: 首页 > news >正文

力扣47:全排列Ⅱ

力扣47:全排列Ⅱ

  • 题目
  • 思路
  • 代码

题目

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

思路

又是任意顺序和所有不重复的排列,显而易见我们要使用回溯的办法。
首先是回溯的结束条件即新数组的长度等于nums的长度。这道题的难点主要是如何判断当前位置已经被使用过以及当前位置是否是重复的也就是是否已经插入过了。之前的全排列Ⅰ我们使用的是bool类型的数组来判断当前位置是否被使用了,这道题同样可以使用这种方法不过想要使用这种方法我们每次都需要从头开始遍历这个bool数组从而得到一个值为false的位置。所以这次我们换一个方式我们使用过这个位置代表着什么,代表着这个位置被固定了因为他已经插入到临时数组里了它最后是要被插入到答案里的。所以我们可以定义一个变量number,这个变量代表的意思是这是第几位数字,每当我们使用过一个位置后我们就把当前位置的值和number位置的值进行交换,这样做还有一个好处就是我们不需要定义临时数组了我们直接在nums上进行交换最后长度即number等于nums的长度后直接插入nums即可。
其次就是如何解决剪枝的问题,这个问题也好解决我们在每次进入回溯函数的时候定义一个哈希表即set,在每次进入遇到一个位置时先判断它的值在set中是否能找到能找到说明它不能被固定了直接跳过到下一个位置,找不到就将该位置的值插入到set中。

代码

class Solution {
public:// 回溯void totalSort(vector<int>& nums, vector<vector<int>>& res, int number) {// 如果当前位置等于长度就直接插入if (number == nums.size()) {res.push_back(nums);return;}set<int> s;for (int i = number; i < nums.size(); i++) {// 剪枝// 如果在set中存在就说明是重复元素会导致答案重复if (s.find(nums[i]) != s.end()) {continue;}s.insert(nums[i]);// 固定使用过的值到number位置上swap(nums[i], nums[number]);totalSort(nums, res, number + 1);swap(nums[i], nums[number]);}}vector<vector<int>> permuteUnique(vector<int>& nums) {vector<vector<int>> res;totalSort(nums, res, 0);return res;}
};
http://www.xdnf.cn/news/1287343.html

相关文章:

  • 基于Python的《红楼梦》文本分析与机器学习应用
  • 力扣 hot100 Day71
  • vivo Pulsar 万亿级消息处理实践(2)-从0到1建设 Pulsar 指标监控链路
  • [激光原理与应用-254]:理论 - 几何光学 - 自动对焦的原理
  • 数据结构:中缀到后缀的转换(Infix to Postfix Conversion)
  • Flutter GridView的基本使用
  • Java 工厂方法模式
  • 【项目设计】高并发内存池
  • 北京-4年功能测试2年空窗-报培训班学测开-第七十四天-线下面试-聊的很满意但可能有风险-等信吧
  • cuda排序算法--双调排序(Bitonic_Sort)
  • web前端第二次作业
  • 开发避坑指南(23):Tomcat高版本URL特殊字符限制问题解决方案(RFC 7230 RFC 3986)
  • TF-IDF:信息检索与文本挖掘的统计权重基石
  • 多奥电梯智能化解决方案的深度解读与结构化总结,内容涵盖系统架构、功能模块、应用场景与社会价值四大维度,力求全面展示该方案的技术先进性与应用前景。
  • Agent智能体基础
  • vue3大事件
  • Linux随记(二十二)
  • 本地(macOS)和服务器时间不同步导致的 Bug排查及解决
  • 从裸机到云原生:Linux 操作系统实战进阶的“四维跃迁”
  • 【Linux】程序地址空间
  • CTO如何通过录音转写和音频降噪,提升企业远程协作效率?
  • 定制客车系统线上购票系统功能设计
  • springboot+JPA
  • 机械臂的智能升维:当传统机械臂遇见Deepoc具身智能大模型从自动化工具到具身智能体的范式革命
  • 【KO】android 音视频
  • Elasticsearch JavaScript 客户端「基础配置」全指南(Node/TS)
  • AWT与Swing深度对比:架构差异、迁移实战与性能优化
  • Git 常用命令速查表
  • java面试题储备4: 谈谈对es的理解
  • 【Go】Gin 超时中间件的坑:fatal error: concurrent map writes