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++;
        }
    }

 

posted @ 2016-08-13 16:18  江湖凶险  阅读(552)  评论(0编辑  收藏  举报