Leetcode:46. 全排列、47. 全排列 II(C++)

news/2024/11/23 3:12:43/

目录

46. 全排列

问题描述:

实现代码与解析:

回溯:

原理思路:

47. 全排列 II

题目描述:

实现代码与解析:

回溯:

原理思路:


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]]

实现代码与解析:

回溯:

class Solution {
public:vector<int> path;//记录路径vector<vector<int>> result;//记录结果void backtracking(vector<int> nums,vector<int> used){//全部遍历完了if(path.size()==nums.size()){result.push_back(path);return;}for(int i=0;i<nums.size();i++){//跳过已经使用过的if(used[i]==1) continue;used[i]=1;path.push_back(nums[i]);//处理backtracking(nums,used);//递归path.pop_back();//回溯used[i]=0;//回溯}}vector<vector<int>> permute(vector<int>& nums) {vector<int> used(nums.size(),0);//初始化为0backtracking(nums,used);return result;}
};

原理思路:

        此题寻找的是全排列组合,所以我们每次遍历都要重头开始寻找,而不是向后去循环,所以显然不能重复去循环一个数,所以我们用一个used数组去记录已经用过的数,再次遇到时就跳过此次循环即可。

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]]

实现代码与解析:

回溯:

class Solution {
public:vector<int> path;//记录路径vector<vector<int>> result;//记录结果void backtracking(vector<int> nums,vector<int> used){//全部遍历完了if(path.size()==nums.size()){result.push_back(path);return;}for(int i=0;i<nums.size();i++){//数层上去重if(i>0&&nums[i]==nums[i-1]&&used[i-1]==0) continue;//树枝上跳过已经用过的数if(used[i]==1) continue;used[i]=1;path.push_back(nums[i]);//处理backtracking(nums,used);//递归path.pop_back();//回溯used[i]=0;//回溯}}vector<vector<int>> permuteUnique(vector<int>& nums) {vector<int> used(nums.size(),0);sort(nums.begin(),nums.end());backtracking(nums,used);return result;}
};

原理思路:

        在上一题的基础上,仅仅多了一个树层去重的逻辑,当然这样写要先排序。

//数层上去重
if(i>0&&nums[i]==nums[i-1]&&used[i-1]==0) continue;

        其实最重要的就是理解为什么要加上used[i-1]=0,因为我们这里是树层上的去重,确保的是当前层循环不出现同样的数,而在不同层上是可以出现同样的数,若与此次循环相同的上一个数是在上一层循环就用过的数,那么此层循环就可以取这个数,所以要加上这个逻辑。为什么以往的题就不用加呢,因为以往的题递归都是从i+1的逻辑开始遍历,本身就避免了这种情况,大家可以仔细想一想。


http://www.ppmy.cn/news/19526.html

相关文章

Linux|奇怪的知识---CPU温度监控

前言&#xff1a; 最近我的台式机电脑CPU风扇由于积灰严重&#xff0c;噪音比较大&#xff0c;因此更换了CPU风扇。 更换比较简单没什么好说的&#xff0c;但我想清楚的知道我的CPU温度到底是多少&#xff0c;进而知道这个新风扇是否能给CPU一个清凉的环境&#xff0c;因此需…

SaaS是什么,目前主流的国内SAAS平台提供商有哪些?

SaaS是什么&#xff0c;目前主流的国内SAAS平台提供商有哪些&#xff1f;SaaS这个概念近两年可谓说是十分火热&#xff0c;尤其是后疫情时代。 但还是有很多人对SaaS这个名词云里雾里&#xff0c;被碎片化的信息裹挟&#xff0c;并没有真正意义上理解SaaS的概念。 这篇就综合…

数学小抄: 李群李代数再回顾 [SLAM十四讲]

前言 最近阅读了高翔老师的视觉SLAM十四讲, 也算是了解了当下机器人领域最炙热的机器人领域前沿研究问题大概是怎么样的数学问题. 不得不说视频与书籍真的是深入浅出. 所有第三库无痛安装教程: 知乎链接 SLAM 主要解决的偏颇地说就是在求解一个非线性系统状态方程, 相应的后端…

Element-UI的dialog对话组件内的tinymce弹窗被遮挡的解决办法及其它相关注意事项

问题一&#xff1a;tinymce的弹窗被遮挡 问题截图 解决办法 修改层级 注意要写在 <style></style> 中&#xff0c;我当时没注意&#xff0c;写在了 <style scoped></style> 中&#xff0c;死活没反应。 <style> /* 在el-dialog中tinymce z-ind…

总结:计算机中字符串比较大小的规则

总结&#xff1a;计算机中字符串比较大小的规则一背景&#xff1a;二Unicode编码表&#xff1a;字符越靠后&#xff0c;对应的十进制值越大三单个字符之间比较规则&#xff1a;1.Java编程中常用的Character类compareTo()方法比较单个字符大小&#xff1a;底层解析2案例演示&…

Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】

Leave no stone unturned. 竭尽全力 文章目录1. 基本概念1.1 功能1.2 与普通数组相同点与不同点1.3 动态扩展2. 构造函数2.1 功能描述2.2 函数原型2.3 代码展示3. 赋值操作3.1 函数原型3.2 代码展示4. 容量及大小4.1 函数原型4.2 代码展示4.2.1 empty()4.2.1.1 代码展示4.2.1.2…

python列表用法

一、python列表用法 #codingutf-8list01[a,b,c,c,d,e,f,study,python]list01.append(hello) #追加列表元素,格式&#xff1a;列表名.append(追加元素)&#xff0c;注意不用赋值给另一个变量&#xff0c;直接增加list01.insert(2,world) #指定位置添加元素 格式&#xff1a;列…

【LeetCode】计算右侧小于当前元素的个数 [H](归并排序)

315. 计算右侧小于当前元素的个数 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给你一个整数数组 nums &#xff0c;按要求返回一个新数组 counts 。数组 counts 有该性质&#xff1a; counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。 示例 1&#xff1a; …