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的更多相关文章

  1. 【LeetCode题意分析&解答】40. Combination Sum II

    Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...

  2. 【LeetCode题意分析&解答】37. Sudoku Solver

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  3. 【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 ...

  4. ACM金牌选手整理的【LeetCode刷题顺序】

    算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑 ...

  5. 【LeetCode每天一题】Permutations(排列组合)

    Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3] O ...

  6. 【leetcode刷题笔记】Permutations II

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  7. 【leetcode刷提笔记】Permutations

    Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...

  8. 【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 ...

  9. 【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 ...

  10. 【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 ...

随机推荐

  1. RabbitMQ 很成熟 不是阿里的

    简介 官网 http://www.rabbitmq.com RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现 RabbitMQ实现了AMQ ...

  2. Linux -定时任务调度

    l crond 任务调度   crontab 进行定时任务的设置,. 概述 任务调度:是指系统在某个时间执行的特定的命令或程序. 任务调度分类:1.系统工作:有些重要的工作必须周而复始地执行.如病毒扫 ...

  3. GPRS的短信和打电话功能

    短信功能: 发短信设置文本格式就可以了:但收短信可能收到的是乱码,需要编写解码程序才可以: 关于打电话单片机复位功能: 首先要建立黑白名单制度过滤手机号,只运行白名单的手机对的单片机打电话:其它的不响 ...

  4. MVC引入SERVICE层 提高代码重用性 沟通CONTROL和MODEL

    MVC是web开发中常见的程序结构. 简单的mvc结构如下: view层:显示层. control层:业务层,集合了各种action. model层:模型层,一般和数据打交道.简单的sample:一个 ...

  5. MySQL限制查询结果返回的数量limit

    1限制查询结果 [limit {[offset,] row_count | row_count offset}] row_count 起始行(第一行是0) offset 偏移量 输出几行记录

  6. find ip from hostname or find hostname from ip

    1. find ip from hostname ping <hostname> 2.fin hostname from ip nslookup <ip>

  7. Maven 常见知识点整理

    认识 Maven Maven 的作用? 1.添加第三方jar包 2.解决jar包之间的依赖关系 3.获取第三方jar包 4.将项目拆成多个工程模块 Maven 是什么? 是Apache软件基金会组织维 ...

  8. Dell解决黑苹果网卡(BCM94352ZAE/DW1560)怎么都打不开WiFi

    Dell解决黑苹果网卡(BCM94352ZAE/DW1560)怎么都打不开WiFi 2017年10月20日17:41:00 by SemiconductorKING 本来觉得驱动这个网卡不是个问题,以 ...

  9. 深入Java关键字null

    一.null是代表不确定的对象   Java中,null是一个关键字,用来标识一个不确定的对象.因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量.   比如:int a = nu ...

  10. Hadoop学习笔记(4) ——搭建开发环境及编写Hello World

    Hadoop学习笔记(4) ——搭建开发环境及编写Hello World 整个Hadoop是基于Java开发的,所以要开发Hadoop相应的程序就得用JAVA.在linux下开发JAVA还数eclip ...