Leetcode 77. Combinations 组合算法 解题报告

1 解题思路

适逢期末,事情比较多,而且最近心好烦,所以更新不规律了一点,“大姨爹”来了吧。

所谓组合问题,可以理解为在1..n个数字里面,选k个数字,那么能选出多少种呢?注意,这里只要求组合,不要求排列,即12和21并不区别。

在数学上的话就是C的那个符号了,这里不好表述,排列组合的话就是A那个符号了。

因此这道题也很简单,直接递归顺序填入数字就可以
规则是,下一位填入的数字,不得小于当前的,其他没有了

例如开头可以选1.那么第二个只能选2…等。。把所有可能搜索一遍选一个,刚好遍历完成。

这道题其实就是经典的排列组合问题。。我依稀中有一种神秘的解法,但是我记不得了。现在写的这个,最后AC后运行时间很靠前,我也就不纠结了。

2 原题

Given two integers n and k, return all possible combinations of k numbers out of 1 … n.

For example,
If n = 4 and k = 2, a solution is:

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

3 AC解

public class Solution {
    /**
     * 直接递归就可以:
     * 规则是,下一位填入的数字,不得小于当前的,其他没有了
     * */
    List<List<Integer>> result;
    public void find(int n,int remains,List<Integer> tmp,int index){
        if(remains==0){
            List<Integer> t= new ArrayList<Integer>();
            t.addAll(tmp);
            result.add(t);
            return ;
        }
        //注意最右边那个条件,是为了防止无用的递归,因为剩下的位数必须要足够,所以加入了一个判断
        for(int i=index;i<=n && i+remains-1<=n;i++){
            tmp.add(i);
            find(n,remains-1,tmp,i+1);
            tmp.remove(tmp.size()-1);
        }
    }
    public List<List<Integer>> combine(int n, int k) {
        result=new ArrayList<List<Integer>>();
        find(n,k,new ArrayList<Integer>(),1);
        return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值