zoukankan      html  css  js  c++  java
  • 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++;
            }
        }
  • 相关阅读:
    Android 系统广播机制
    NBUT 1457 Sona (莫队算法)
    内存分配--静态内存、栈和堆
    Hibernate主键生成策略
    UVA 1482
    servlet开篇
    C语言的代码内存布局具体解释
    Mirantis Fuel fundations
    openstack中文文档
    C++ 之再继续
  • 原文地址:https://www.cnblogs.com/mydesky2012/p/5768230.html
Copyright © 2011-2022 走看看