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. mysql 03

    CREATE TABLE class(    empno INT,    ename VARCHAR(4),    job VARCHAR(4),    mgr INT,    hiredate DA ...

  2. Kubernetes Running Locally

    1. Requirements 1) Linux Not running Linux? Consider running Minikube, or on a cloud provider like G ...

  3. nodejs --- 核心概念

    nodejs是2009年有Ryan Dahl利用google的V8引擎打造的基于事件循环实现的异步I/O框架,它选择JavaScript作为开发语言,正是因为V8的性能远超过其他脚本语言.目前expr ...

  4. 026-log4j配置文件模板

    模板一: ### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender lo ...

  5. html的img标签

    html显示图片 1.最简单: <img src="图片路径"/> 2.如果要改变图片显示的尺寸 <img src="图片路径" width= ...

  6. h5空白页面过渡加载

    h5空白页面过渡加载 页面第一部分内容是图片,考虑到手机图片加载慢,想用简单.转化为base64的图片过渡 开始尝试将图片转为灰度图片,结果还是很大. 后来选取重要元素,保存2位的png,尺寸是494 ...

  7. Hibernate 多对多拆分 两个多对一

  8. net 记录controller Action耗时

    可能有些时候需要记录Action的执行时间来优化系统功能,这时可以用过滤器来实现 第1个例子 using System; using System.Diagnostics; using System. ...

  9. window.open()被浏览器拦截问题汇总

    一.问题描述 最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,虽然在自己的环境可以对页面进行放行,但是对用户来说,不能要求用户都来通过拦截.何况当出现拦截时,很多用户根本不知道发 ...

  10. 【Hadoop系列】linux SSH原理解析

    本文中斜体加粗代表shell指令,操作环境 CentOS6.5 linux root免密码登录链接:[Hadoop系列]linux下 root用户免密码登录远程主机 ssh. linux 非root用 ...