zoukankan      html  css  js  c++  java
  • 第一节.排列组合

          总结:什么时候用回溯法?

          如果题目要求求出所有满足条件的解,一般来说是用回溯法,记住回溯法的模板,对不同的题目只需要修改这个条件即可。  

          回溯法的本质是在问题的解空间树上做深度优先搜索(DFS)。这节课主要讲了四个排列组合的问题,分别是子集,带重复元素的子集,全排列,带重复元素的全排列。本文分析求子集的问题,给出程序模板。

          题目1:给定一个含不同整数的集合,返回其所有的子集。

          样例:

    如果 S = [1,2,3],有如下的解:

         

    [
      [3],
      [1],
      [2],
      [1,2,3],
      [1,3],
      [2,3],
      [1,2],
      []
    ]

    代码:

    public class Solution {
        public List<List<Integer>> subsets(int[] nums) {
            List<List<Integer>> results = new ArrayList<List<Integer>>();
            helper(nums,results,new ArrayList<Integer>(),0);
            return results;
        }
        
        public void helper(int[] nums,List<List<Integer>> res,List<Integer> cur,int start){
            List<Integer> subset = new ArrayList<Integer>(cur);
            res.add(subset);
            
            for(int i=start;i<=nums.length-1;i++){
                cur.add(nums[i]);
                helper(nums,res,cur,i+1);
                cur.remove(cur.size()-1);
            }
        }
    }

    写的时候要注意递归的三要素:

    1.递归的定义。这里的helper函数定义为:将所有以当前cur子集开头的所有子集(包含当前cur)加入到结果res中。

    2.递归的出口。即满足什么条件保存答案。这里对每个遍历得到的cur都保存答案。

    3.递归的拆解。拆解为更小规模的问题。

    注意理解这里的DFS思想:当前cur开头的所有子集找完了,才去找下一个cur开头的所有子集。

          题目2:带重复元素的全排列

          代码:见lintcode

          思路:这道题难点在于去除重复元素影响。 比如,给出一个排好序的数组,[1,2,2],那么第一个2和第二2如果在结果中互换位置, 我们也认为是同一种方案,所以我们强制要求相同的数字,原来排在前面的,在结果当中也应该排在前面,这样就保证了唯一性。所以当前面的2还没有使用的时候,就不应该让后面的2使用。

    
    
  • 相关阅读:
    jmeter 参数化测试
    jmeter属性与变量
    jmeter作用域规则
    jmeter执行顺序
    jmeter元素
    Array Transformer UVA
    A Simple Problem with Integers POJ
    分块 && 例题 I Hate It HDU
    c文件二进制读取写入文件、c语言实现二进制(01)转化成txt格式文本、c读取文件名可变
    sort排序使用以及lower_bound( )和upper_bound( )
  • 原文地址:https://www.cnblogs.com/coldyan/p/5839229.html
Copyright © 2011-2022 走看看