题目:
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++; } }