77. Combinations (java 求C(n,k)的组合,排除重复元素)

题目:

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

解析:求全部组合的过程一样,只是这里限制每个组合中元素的个数为k,求所有组合时并不限制元素个数。

          若要排除重复的元素,则首先对所有元素进行排序。

代码:

 

   public static List<List<Integer>> getAllCombinations(int[] array,int k){
            Arrays.sort(array); //排序,为了在接下来求组合时排除重复组合
            List<List<Integer>> list = new ArrayList<List<Integer>>();
            List<Integer> item = new ArrayList<Integer>();
            dfs_repeated(list, item, 0, array, k);
            return list;
    }

 

    /**
     * 存在重复元素,解决方法参考subsetsII
     * 求子集的算法同求重复元素的算法原理是相同的!
     * 首先对数组元素进行排序
     * {1,2,2}的所有组合有 1,2,12,122
     */
    public static void dfs_repeated(List<List<Integer>> list, List<Integer> item, int start, int[] array,int k){
  
        if(item.size() == k)
            list.add(new ArrayList<Integer>(item));
        int i = start;
        while(i < array.length){
            item.add(array[i]);
            dfs_repeated(list, item, i + 1, array, k);
            item.remove(item.size() - 1);
            i++;
            //排除重复的元素,直到找到一个不重复的元素时再添加
            while(i < array.length && array[i] == array[i - 1])
                i++;
        }
    }

 

转载于:https://www.cnblogs.com/mydesky2012/p/5768230.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值