这个算法感觉还是很陌生的。算法导论里没有讲这个算法,而数据结构与算法分析只用了一节来阐述。我居然跳过去了。。尴尬。

笨方法解决的:

第一题:

给定一个元素不重复的数组,枚举出他们的全排列。

方法1:递归。

a[0] a[1] a[2]...a[n-1]这些元素的全排列,可以在 a[1]...a[n-1]的全排列的基础上,插入一个a[0]就可以获得了。

因为所有元素不重复,那么a[0]的插入位置实际上有n种。

方法2:回溯。实际上是深度优先搜索。

先选取一个点放入数组,再从余下的里面选取一个点,再从余下的选。。。一层层的来。

这里还有一个递归、然后回溯一步。

现在就是死记硬背的算法。实在没有深入的理解!

先记下算法:

class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<int> visited(nums.size(),);
vector<int> last; for(int i = ; i < nums.size(); i ++)
{
visited[i] = ;
last.push_back(nums[i]);
back_track(nums,,visited,last);
last.pop_back();
visited[i] = ;
} return ans;
} private:
void back_track( vector<int> &a, int depth,vector<int> &visited, vector<int>&last)
{
if(depth == a.size())
{
ans.push_back(last);
return;
}
for(int i = ; i < a.size(); i++)
{
if(!visited[i])
{
visited[i] = ;
last.push_back(a[i]);
back_track(a,depth + , visited, last);
last.pop_back();
visited[i] = ;
}
}
}
vector<vector<int>> ans;
};

第二题:是有可能有重复的元素,这时候要求给出不重复的全排列。

思考,可能的重复是什么样的呢?

比如  1   1  1  2

按照之前的思路,选a[0]做第一个,或者a[1] a[2] a[3]

这时候,前三个当第一个,其实是一种情况。肯定会重复的。

怎样避免呢?就是保证重复元素在全排列中的顺序,和他们在数组中的顺序是一样的。

怎么实现?也就是  在这个例子中,前三个1的先后顺序必须保持一致。

保证重复的元素只有一种访问顺序,也就是靠前的先访问,靠后的后访问。

对于重复的元素:只有在前面的元素访问过以后,才可以添加后面的元素。

class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<bool>visited(nums.size(),false);
vector<int>& a = nums;
vector<int>last;
sort(a.begin(),a.end());
for(int i = ; i< nums.size(); i++)
{
if(i > && a[i] == a[i-] && visited[i-] == false)
continue; visited[i] = true;
last.push_back(a[i]); back_track(a,,visited,last); last.pop_back();
visited[i] = false;
} return ans;
} void back_track(vector<int>& a, int depth, vector<bool> &visited, vector<int>&last)
{
if(depth == a.size())
{
ans.push_back(last);
return;
} for(int i = ; i < a.size(); i ++)
{
if(!visited[i]) //i 是未添加的
{
if(i > && a[i] == a[i-] && visited[i-] == false)
continue; visited[i] = true;
last.push_back(a[i]);
back_track(a, depth + ,visited, last );
last.pop_back();
visited[i] = false;
}
}
}
private:
vector<vector<int>> ans;
};

LeetCode题解 Permutations II 和 Permutations I ——回溯算法的更多相关文章

  1. LeetCode 47. 全排列 II(Permutations II)

    题目描述 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 解题思路 类似于LeetCode4 ...

  2. Leetcode之回溯法专题-47. 全排列 II(Permutations II)

    Leetcode之回溯法专题-47. 全排列 II(Permutations II) 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2] ...

  3. leetcode Permutations II 无重全排列

    作者:jostree  转载请注明出处 http://www.cnblogs.com/jostree/p/4051169.html 题目链接:leetcode Permutations II 无重全排 ...

  4. [Leetcode][Python]47: Permutations II

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 47: Permutations IIhttps://oj.leetcode. ...

  5. Permutations II - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Permutations II - LeetCode 注意点 不确定有几种排列 解法 解法一:因为有重复的数字所以排列的个数不确定几个,一直生成新的排列直 ...

  6. LeetCode: Permutations II 解题报告

    Permutations II Given a collection of numbers that might contain duplicates, return all possible uni ...

  7. LeetCode解题报告—— Permutations & Permutations II & Rotate Image

    1. Permutations Given a collection of distinct numbers, return all possible permutations. For exampl ...

  8. 回溯---Permutations II

    47.Permutations II (Medium)](https://leetcode.com/problems/permutations-ii/description/) [1,1,2] hav ...

  9. 【leetcode】Permutations II

    Permutations II Given a collection of numbers that might contain duplicates, return all possible uni ...

随机推荐

  1. mysql查询优化之四:优化特定类型的查询

    本文将介绍如何优化特定类型的查询. 1.优化count()查询count()聚合函数,以及如何优化使用了该函数的查询,很可能是mysql中最容易被误解的前10个话题之一 count() 是一个特殊的函 ...

  2. 函数的进阶(动态参数,命名空间和作用域,函数的嵌套,gloabal和nonlocal关键字)

    1. 函数参数--动态传参 昨天已经解过了传参, 如果需要给一个函数传参,而参数又是不确定的. 或者我们给一个函数传很多参数, 我的形参就要写很多, 写起来就很麻烦, 这时我们可以考虑使用动态参数.形 ...

  3. [UE4]修改枪支碰撞体

    一.Simple Collision:显示简单碰撞体,Comlex Collision:显示复杂碰撞体 二.添加简单和复杂碰撞体 三.自动生成复杂精确的碰撞体

  4. java中synchronized 用在实例方法和对象方法上面的区别

    https://bijian1013.iteye.com/blog/1836575 在Java中,synchronized 是用来表示同步的,我们可以synchronized 来修饰一个方法.也可以s ...

  5. c#类 对象 构造函数 析构函数——面向对象

    类: 也是复杂数据类型 也是需要我们先定义出类型,才能使用它的数据 对象: 是通过模板类实例化出来的个体,具有具体的属性和行为(方法),对象是不能索引到静态方法. 对象的生命周期 构造—— 使用—— ...

  6. C# webbrowser全掌握(二)

    全篇引用单元mshtml; 路径:C:\windows\assembly\GAC\Microsoft.mshtml\7.0.3300.0__b03f5f7f11d50a3a\Microsoft.msh ...

  7. ubuntu下 net core 安装web模板

    ---恢复内容开始--- 今天想试试在Linux用C#开发WebAPI,查了下,要用: dotnet new -t Web 来建立工程,结果我试了下,出来这段: Invalid input switc ...

  8. 用最通俗的话解释AJAX是什么东西

    直白地说,就是没用AJAX的网页,你点一个按钮就要刷新一下页面,尽管新页面上只有一行字和当前页面不一样,但你还是要无聊地等待页面刷新. 用了AJAX之后,你点击,然后页面上的一行字就变化了,页面本身不 ...

  9. 十年阿里java架构师的六大设计原则和项目经验

      先看一幅图吧: 这幅图清晰地表达了六大设计原则,但仅限于它们叫什么名字而已,它们具体是什么意思呢?下面我将从原文.译文.理解.应用,这四个方面分别进行阐述. 1.单一职责原则(Single Res ...

  10. Jquery在表格中搜索关键字

    <!DOCTYPE html><html><head> <title>ddd</title></head><body> ...