方法:

1. 递归函数

2. 栈
3. 队列
4. 深度优先搜索( DFS , Depth-First Search),又常称为回溯法

5. 广度优先搜索(BFS, Breadth-First Search)

1. Subsets:DFS

public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> result = new ArrayList<List<Integer>>();List<Integer> list = new ArrayList<Integer>();if (nums == null || nums.length == 0) {return result;} Arrays.sort(nums);dfs(nums, 0, list, result);return result;} private void dfs(int[] nums, int pos, List<Integer> list,List<List<Integer>> ret) {// add temp result firstret.add(new ArrayList<Integer>(list));for (int i = pos; i < nums.length; i++) {list.add(nums[i]);dfs(nums, i + 1, list, ret);list.remove(list.size() - 1);}}

有重复元素的子集

public ArrayList<ArrayList<Integer>> subsetsWithDup(ArrayList<Integer> S) {ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();if (S == null) return result;//Collections.sort(S);List<Integer> list = new ArrayList<Integer>();dfs(S, 0, list, result);return result;} private void dfs(ArrayList<Integer> S, int pos, List<Integer> list, ArrayList<ArrayList<Integer>> result) {result.add(new ArrayList<Integer>(list));for (int i = pos; i < S.size(); i++) {// exlude duplicateif (i != pos && S.get(i) == S.get(i - 1)) {continue;}list.add(S.get(i));dfs(S, i + 1, list, result);list.remove(list.size() - 1);}}

2. Permutations

public List<List<Integer>> permute(int[] nums) {List<List<Integer>> result = new ArrayList<List<Integer>>();if (nums == null || nums.length == 0) return result;List<Integer> list = new ArrayList<Integer>();dfs(nums, list, result);return result;} private void dfs(int[] nums, List<Integer> list, List<List<Integer>>result) {if (list.size() == nums.length) {result.add(new ArrayList<Integer>(list));return;} for (int i = 0; i < nums.length; i++) {if (list.contains(nums[i])) continue;list.add(nums[i]);dfs(nums, list, result);list.remove(list.size() - 1);}}

含有重复元素的排列:

public List<List<Integer>> permuteUnique(int[] nums) {List<List<Integer>> result = new ArrayList<List<Integer>>();if (nums == null || nums.length == 0) {return result;} Arrays.sort(nums);while (true) {// step1: add list to resultList<Integer> list = new ArrayList<Integer>();for (int i : nums) {list.add(i);}result.add(list);// step2: find nums[k] < nums[k + 1] backwardint k = -1;for (int i = nums.length - 2; i >= 0; i--) {if (nums[i] < nums[i + 1]) {k = i;break;}}if (k == -1) break;// step3: swap with nums[l]int l = nums.length - 1;while (l > k && nums[l] <= nums[k]) {l--;}int temp = nums[l];nums[l] = nums[k];nums[k] = temp;// step4: reverse between k+1, nums.length - 1reverse(nums, k + 1, nums.length - 1);} return result;} private void reverse(int[] nums, int lb, int ub) {while (lb < ub) {int temp = nums[lb];nums[lb] = nums[ub];nums[ub] = temp;lb++;ub--;}}

下一个排列

 public int[] nextPermutation(int[] nums) {if (nums == null || nums.length <= 1) {return nums;}// step1: find nums[i] < nums[i + 1]int i = 0;for (i = nums.length - 2; i >= 0; i--) {if (nums[i] < nums[i + 1]) {break;} else if (i == 0) {// reverse nums if reach maximumreverse(nums, 0, nums.length - 1);return nums;}}// step2: find nums[i] < nums[j]int j = 0;for (j = nums.length - 1; j > i; j--) {if (nums[i] < nums[j]) {break;}}// step3: swap betwenn nums[i] and nums[j]int temp = nums[i];nums[i] = nums[j];nums[j] = temp;// step4: reverse between [i + 1, n - 1]reverse(nums, i + 1, nums.length - 1);return nums;} private void reverse(int[] nums, int start, int end) {for (int i = start, j = end; i < j; i++, j--) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}

3. Combinations

Exhaustive Search - 穷竭搜索相关推荐

  1. 《挑战程序设计竞赛》学习笔记(二):穷竭搜索

    2.1 穷竭搜索 深度优先搜索 部分和问题 /*************************************************** User name: 寻雾启示wpf Note: ...

  2. 《挑战程序设计竞赛》--初级篇习题POJ部分【穷竭搜索+贪心】

    最近看了<挑战程序设计竞赛>初级篇,这里总结一下部分poj上的练习题,主要涉及方面为: 穷竭搜索 and 贪心算法 具体题目: 简单导航 一.穷竭搜索 二.贪心算法 一.穷竭搜索 穷竭搜索 ...

  3. AOJ 0525 Osenbei【穷竭搜索】

    AOJ 0525 题意: 有一个烤饼器可以烤r行c列的煎饼,煎饼可以正面朝上(用1表示)也可以背面朝上(用0表示).一次可将同一行或同一列的煎饼全部翻转.现在需要把尽可能多的煎饼翻成正面朝上,问最多能 ...

  4. 第 2 章:初出茅庐【初级篇 - 2.1 穷竭搜索】

    目录 201. 部分和问题[爆搜] 202. 水洼计数 Lake Counting[连通块] 203. 迷宫的最短路径[bfs] 201. 部分和问题[爆搜] https://www.papamelo ...

  5. poj3050 穷竭搜索 挑战程序设计竞赛

    2018-1-31 一开始题目没有读懂,没有看到样例中的唯一的2... 这题用STL里的set求解极为方便,因为set里的元素是不相同的,最后只要输出它的size即可 #include<iost ...

  6. poj3187 穷竭搜索 挑战程序设计大赛

    2018-1-30 直接用dfs求解即可,一开始的时候提交TLE,后来优化一下就OK了! #include<iostream> #include<cstring> using ...

  7. c语言中穷竭算法,hihocoder#1054 : 滑动解锁(深度优先搜索)

    描述 滑动解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图案.方向上 ...

  8. 对于穷竭搜索算法优化的思考,以一群蚂蚁在竿子上爬行为例

    有个这么一个最短距离或者最长距离的问题.有n只蚂蚁以每秒钟1cm的速度在Lcm的竿子上爬行.当蚂蚁爬到竿子的端点时就会掉落.由于竿子太细,两只蚂蚁相遇时,他们不能交错通过,只能各自反向爬回去.对于每只 ...

  9. AOJ——分治递归之Exhaustive Search穷尽搜索

    AOJ的分治递归的第一题: Exhaustive Search Write a program which reads a sequence A of n elements and an intege ...

最新文章

  1. 简单介绍Python中异常处理用法
  2. JavaScript创建元素的三种方法特点及对元素的操作
  3. 全国大学生数学建模如何轻松获得一等奖,我想你需要知道这样知识
  4. html 多行多列列表格,HTML跨多行跨多列表格.doc
  5. 立志10天学会C++基础应用—day01
  6. 强命名保护DLL文件
  7. 如何连接到sqlplus
  8. natapp 使用教程
  9. Android简单模仿微信扫一扫二维码
  10. 通过puppet hiera配置bigtop大数据集群
  11. 解决android api30以上,调用华为P50相机,点击拍照无反应问题
  12. 删除的vue怎么找回_vue详情 恢复 删除
  13. 网站下载工具有哪些?
  14. 自然语言处理(NLP)—分词-—word2vec
  15. java 51nod
  16. Laravel 使用视图合成器 view composer 实现视图变量共享
  17. CSS3干货13:把页面变成黑白灰色彩
  18. Base-N 算法加密解密实现:
  19. 输入圆的半径,输出圆的周长和面积
  20. 解决virus:win32/ramnit.a病毒

热门文章

  1. oracle sqlplus 创建表,如何使用SQL语言在SQL*Plus中创建表
  2. IT售前工程师发展规划步骤
  3. tar,zip,rar,gz压缩解压
  4. 2019年Python入门书籍推荐
  5. 2022081班李亚楠20220831
  6. WebAssembly入门-未来可能发生的巨变
  7. 计算机用英语表示方法有哪些,如何用英语表达“电脑那些事儿”
  8. Oracle returning 详解
  9. Html5用户注册自动校验
  10. kindeditor编辑器在火狐浏览器firefox多图上传按钮不显示