【Leetcode】【Medium】Permutations
Given a collection of numbers, return all possible permutations.
For example,[1,2,3]
have the following permutations:[1,2,3]
, [1,3,2]
, [2,1,3]
, [2,3,1]
, [3,1,2]
, and [3,2,1]
.
求队列的"排列"(相似的Leetcode中还有队列"组合"算法:Combination)。典型的使用回溯法。
回溯法都是求队列的排列组合,可分两种情况:
1、一种是元素集合成员少,但是每个元素多次出现,则按照一定规律填充队列,例如Generate Parentheses;
2、一种是元素集合成员多,但是每个元素出现一次,则按照不断交换的方法重组队列,复杂度和排列组合计算的过程一样:n*n-1*n-2*...,例如本题;
对于排列组合题目:
1、组合的算法,可以按照不断填充的方法;
2、排列的算法,不能不断填充,因为无序,可以使用交换的方法;
本题解题思路:
假设ABCDE的全排列,记为P(ABCDE)
那么P(ABCDE) = {A P(BCDE)},{B P(ACDE)},{C P(BADE)},{D P(BCAE)},{E P(BCDA)};
也就是说,ABCDEF的全排列 = A与BCDE的全排列 + B与ACDE的全排列,...
同理P(BCDE) = {B P(CDE)},{C P(BDE)},{D P(CBE)},{E P(CDB)};
....
最终迭代到最后一层的结果,就是全排列的结果;
解题步骤:
1、主函数新建一个二维数组,用于保存全排列结果
2、调用编写的全排列子函数。
3、编写一个求全排列的函数,输入为结果保存集合res_lst(引用传值)、数字集合nums(非引用传值,因为每次迭代都不一样)、待排列的数字起始下标idx。
(1)如果idx = nums.size(),说明已经完成最后一层的全排列,当前nums的排列方式即为一种全排列,将nums装入lst;
(2)从int i = idx遍历到i = 数组尾:
a. 交换nums[idx]和nums[i],即把待排列的每个数字置换出去,对剩下的数字递归全排列;
b. 递归调用求全排列函数,对idx+1及其之后的数字进行全排列;
c. 还要将nums[idx]和nums[i]交换回来,因为不能影响循环下面的交换操作
代码:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> lst;
Backtracking(lst, nums, );
return lst;
} void Backtracking(vector<vector<int>> &lst, vector<int> nums, int idx) {
if (idx == nums.size() - 1) {
lst.push_back(nums);
return;
} for (int i = idx; i < nums.size(); ++i) {
swap(nums[idx], nums[i]);
Backtracking(lst, nums, idx+);
swap(nums[idx], nums[i]);
}
}
};
【Leetcode】【Medium】Permutations的更多相关文章
- 【LeetCode题意分析&解答】40. Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...
- 【LeetCode题意分析&解答】37. Sudoku Solver
Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...
- 【LeetCode题意分析&解答】35. Search Insert Position
Given a sorted array and a target value, return the index if the target is found. If not, return the ...
- ACM金牌选手整理的【LeetCode刷题顺序】
算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑 ...
- 【LeetCode每天一题】Permutations(排列组合)
Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3] O ...
- 【leetcode刷题笔记】Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
- 【leetcode刷提笔记】Permutations
Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...
- 【LeetCode算法题库】Day7:Remove Nth Node From End of List & Valid Parentheses & Merge Two Lists
[Q19] Given a linked list, remove the n-th node from the end of list and return its head. Example: G ...
- 【LeetCode算法题库】Day4:Regular Expression Matching & Container With Most Water & Integer to Roman
[Q10] Given an input string (s) and a pattern (p), implement regular expression matching with suppor ...
- 【LeetCode算法题库】Day3:Reverse Integer & String to Integer (atoi) & Palindrome Number
[Q7] 把数倒过来 Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Outpu ...
随机推荐
- Python处理文件和查漏
import os,re def change_filename(root): ''' 批量修改excel文件名 ''' for root_,_, fs in os.walk(root): for f ...
- STM32的固件升级(RTT
STM32 通用 Bootloader ,让 OTA 更加 Easy 目前支持F1/F4,在线制作bootloader,准备固件升级,是RTT的云设备管理平台 https://mp.weixin.qq ...
- C# 直接创建一个DataTable,并为之添加数据(自定义DataTable) 转
DataTable dt=new DataTable("cart"); DataColumn dc1=new DataColumn("prizename",Ty ...
- UnxUtils让windows下的dos命令变为linux下的命令
一.UnxUtils UnxUtils是一个可以支持在Windows下使用linux命令的工具,用习惯了linux之后,感觉Windows的dos命令实在是太难用了,发现了这个工具,非常的小,装了它之 ...
- CCF 201409-4 最优配餐
问题描述 试题编号: 201409-4 试题名称: 最优配餐 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么 ...
- 深入理解JavaScript系列(50):Function模式(下篇)
介绍 本篇我们介绍的一些模式称为初始化模式和性能模式,主要是用在初始化以及提高性能方面,一些模式之前已经提到过,这里只是做一下总结. 立即执行的函数 在本系列第4篇的<立即调用的函数表达式> ...
- 30 行代码实现 JS 中的 MVC
一连串的名字走马观花式的出现和更迭,它们中一些已经渐渐淡出了大家的视野,一些还在迅速茁壮成长,一些则已经在特定的生态环境中独当一面舍我其谁.但不论如何,MVC已经并将持续深刻地影响前端工程师们的思维方 ...
- sublime text 2编辑器中文问题
Sublime Text 2是一个非常不错的源代码及文本编辑器,但是不支持GB2312和GBK编码在很多情况下会非常麻烦.不过Sublime Package Control所以供的插件可以让Subli ...
- CentOS 启动-运行级别
Linux系统的启动过程:内核的引导 > 运行init > 系统初始化 > 建立终端 > 用户登录系统 运行init init 进程是系统所有进程的起点: 主要功能: 准备软件 ...
- Idea 配置启动JDK___在windows中使用Intellij Idea时选择自定义的64位JVM
略过下面的叙述快速配置 配置你的Idea启动jdk (Idea15之后的版本启动不要JDK1.8) 添加环境变量IDEA_JDK_64,配置和JAVA_HOME环境变量相同,路径写到1.8的jdk就 ...