DFS-求全排列
来源:互联网 发布:搜索引擎 数据库 区别 编辑:程序博客网 时间:2024/06/05 19:14
以[1,2,3]为例,若第一个元素为1,则还要求[2,3]的全排列;第一个元素为2,则还有求[1,3]的全排列........故可用递归实现深度优先遍历,遍历出所有的可能
vector<vector<int>> permute(vector<int> &nums) { // write your code here vector<vector<int>> res; vector<int> P;//P[i]表示第i个位置填的元素 vector<bool> visited(nums.size(),false);//保证同一个数不会被选多次 DFS(res,P,visited,nums,0); return res; } void DFS(vector<vector<int>>& res,vector<int>& P,vector<bool>& visited,vector<int>& nums,int index){ if(index==nums.size()){//下标从0-n-1,index==n时则表示都完成了 res.push_back(P); return; } //执行到这里,表示还没填完 for(int i=0;i<nums.size();++i){ if(!visited[i]){//第i个位置的数还没有用 P.push_back(nums[i]); visited[i]=true; DFS(res,P,visited,nums,index+1);//填下一个位置 //恢复 visited[i]=false; P.pop_back(); } } }
第一次接触的话,可以借助画图的方法理解,index表示正在填的位置的下标,需要借助一个数组visited表示是否使用过了
由图中可以看出程序的流程:
1.由于循环一直是i=0,i<nums.size(),实际上每个节点下面都有3个节点,只是有的重复了,故用斜线划掉,为了简单,图中只画了一部分。这也正是visited数组的作用,避免了重复
2.程序刚进入时,i=0.index=0,第一个位置填了1,然后DFS进入index=1的那一层搜索,i=0,但是nums[0]已经用过了,故i++,i=1开始,第二个位置填了2..........以此类推,搜到最深处则存入res中,这正是深度优先遍历。可以看出程序是按图中从上到下,从左到右的顺序进行搜索,搜索出所有的情况
阅读全文
1 0
- DFS求全排列
- DFS求全排列
- dfs 求全排列
- dfs求全排列模板
- DFS-求全排列
- 【算法】求全排列 回溯 交换 DFS JAVA
- 求全排列
- 求全排列
- 求全排列
- 求全排列
- 求全排列
- 求全排列
- 求全排列
- 求全排列
- 求全排列
- 递归求全排列
- 递归求全排列
- 递归求全排列
- PyTorch学习—PyTorch是什么?
- 表篇(二)-----单链表的创建与使用(c语言版)
- C++ 循环
- BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊
- 【FullCalendar】概叙(一)
- DFS-求全排列
- c++源码分析继承问题
- C++ 判断
- 驱动建模表无法创建原因详细分析
- nyoj21:bfs(三个水杯)
- 微信小程序 | 49,小程序入门集锦系列文章20篇
- FCN制作自己的数据集、训练和测试 caffe
- Android之LruCache使用和源码分析
- Optimal Milking POJ