LeetCode题解 Permutations II 和 Permutations I ——回溯算法
这个算法感觉还是很陌生的。算法导论里没有讲这个算法,而数据结构与算法分析只用了一节来阐述。我居然跳过去了。。尴尬。
笨方法解决的:
第一题:
给定一个元素不重复的数组,枚举出他们的全排列。
方法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 ——回溯算法的更多相关文章
- LeetCode 47. 全排列 II(Permutations II)
题目描述 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 解题思路 类似于LeetCode4 ...
- Leetcode之回溯法专题-47. 全排列 II(Permutations II)
Leetcode之回溯法专题-47. 全排列 II(Permutations II) 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2] ...
- leetcode Permutations II 无重全排列
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4051169.html 题目链接:leetcode Permutations II 无重全排 ...
- [Leetcode][Python]47: Permutations II
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 47: Permutations IIhttps://oj.leetcode. ...
- Permutations II - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Permutations II - LeetCode 注意点 不确定有几种排列 解法 解法一:因为有重复的数字所以排列的个数不确定几个,一直生成新的排列直 ...
- LeetCode: Permutations II 解题报告
Permutations II Given a collection of numbers that might contain duplicates, return all possible uni ...
- LeetCode解题报告—— Permutations & Permutations II & Rotate Image
1. Permutations Given a collection of distinct numbers, return all possible permutations. For exampl ...
- 回溯---Permutations II
47.Permutations II (Medium)](https://leetcode.com/problems/permutations-ii/description/) [1,1,2] hav ...
- 【leetcode】Permutations II
Permutations II Given a collection of numbers that might contain duplicates, return all possible uni ...
随机推荐
- 客户端负载均衡Feign之四:Feign配置
Ribbon配置 在Feign中配置Ribbon非常简单,直接在application.properties中配置即可,如: # 设置连接超时时间 ribbon.ConnectTimeout=500 ...
- Scrapy学习篇(三)之创建项目和Scrapy的安装
安装Scrapy 了解了Scrapy的框架和部分命令行之后,创建项目,开始使用之前,当然是安装Scrapy框架了. 关于Scrapy框架的安装,请参考:https://cuiqingcai.com/5 ...
- GO中DEFER的理解--DEFER执行的原理
在golang当中,defer代码块会在函数调用链表中增加一个函数调用.这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用.因此,defer通常用来释放函数内 ...
- 虚拟机挂载光盘,同时修改yum源为光盘挂载目录
VMware下挂载光盘并安装文件https://blog.csdn.net/gfd54gd5f46/article/details/53968293 linux修改yum本地源的方法https://w ...
- Find the peace with yourself
The purpose of being mature is to find the real calm and peace with yourself. Or you can say the tur ...
- windows server 2012 r2 安装IIS失败
给新的2012服务器安装IIS时报错: 错误原因:就在于选中了.net framework 3.5 . 如果要安装.net framework 3.5 使用以下步骤: 1 加载安装光盘,如果没有可以网 ...
- javascript将list转换成树状结构
/** * 将list装换成tree * @param {Object} myId 数据主键id * @param {Object} pId 数据关联的父级id * @param {Object} l ...
- 生成excel的时候要用双引号。。。。。
<?php header("Content-type:application/vnd.ms-excel"); header("Content-Disposition ...
- angularjs中ng-repeat插入图片
<tr ng-repeat="item in datas" ng-module="datas"> <td> <img class ...
- python项目入门之 安装、创建
3年前接触python,那时候还是文本格式进行学习,但是由于一直没有项目实践,所以就搁浅了 今天,python如火如荼,适用于人工智能等多领域,已经成为了语言界的翘楚 python有非常多的优点,开源 ...