LeetCode77 组合(求数组(不含重复元素)的所有情况的组合)

不含重复元素的所有组合的情况>>>

在这里插入图片描述

集合中元素组合的所有可能:集合中的数据不重复,需要穷举,可以采用递归+回溯的方法;分析回溯算法,常常需要画图来帮助我们理清思路和寻找边界问题:递归什么时候截止,什么时候可以进行剪枝
在这里插入图片描述


package BDyNamicProgramming;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/4/25 0025  14:18
 */
public class Problem77 {

    /**
     * 返回1,2,3.....n数中,组成k个数的所有可能情况
     * @param n
     * @param k
     * @return
     */
    public List<List<Integer>> combine(int n, int k) {

        List<List<Integer>> rs = new ArrayList<>();
        List<Integer> path = new ArrayList<>();
        fun(n,k,rs,path,0);
        return rs;
    }

    /**
     *
     * @param n  待取的数
     * @param k  还剩取的数的个数 (若k==0)则说明找到一个组合
     * @param rs  存取最终存的结果
     * @param path  存储遍历的过程中的路径
     * @param begin  搜索的起始路径(这很关键
     *                   组合(元素可以重复  元素不可以重复)
     *
     *                   排列(
     */
    public void fun(int n,int k,List<List<Integer>> rs,List<Integer> path,int begin){

        //组成一个组合
        if(k==0){
            rs.add(new ArrayList<>(path));
            return;
        }


        //进行递归查找:查找的位置从begin开始
        for(int i=begin;i<n;i++){

            //放这里提前一些,不用递归进去判断
            //意思是,就算将i......n这 n - i + 1个数字都选到vec中,都不够k长度,则不用继续递归了
            if(k -path.size() > n - i + 1)
                return;

            path.add(i+1);
            //接下来查找的位置从其后面的一个位置开始查找(若可以取重复元素则可以从自身开始 其实位置为i)
            fun(n,k-1,rs,path,i+1);
            //进行回溯
            path.remove((Object)(i+1));
        }


    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值