【发布时间】:2015-12-05 16:02:39
【问题描述】:
我正在尝试将列表拆分为几个部分。我需要找到 n 个整数可以分布在 k 个组上的所有可能方式。例如,如果我的列表是 {1,2,3,4,5,6,7},我需要找到可以将其分成 k=3 组的所有方法。我想强调的是,我需要知道所有可能的拆分方式,这对于较大的 n 和/或 k 值来说是一个巨大的数量。但是,我希望这些保持相对较小(个位数),所以应该没有问题。我有这段代码将列表分成两部分:
List<List<Integer>> results;
public void findAllSublists(List<Integer> list, int minimalLengthOfSublist) {
results = new ArrayList<List<Integer>>();
List<List<Integer>> sublists = new ArrayList<List<Integer>>();
for (int i = 0; i <= list.size(); i++) {
recursiveSublist(list, sublists, i, new ArrayList<Integer>(), 0);
}
for (List<Integer> subList : sublists) {
if (subList.size() >= minimalLengthOfSublist) {
results.add(subList);
}
}
}
private static void recursiveSublist(List<Integer> list, List<List<Integer>> subLists, int sublistSize, List<Integer> currentSubList, int startIndex) {
if (sublistSize == 0) {
subLists.add(currentSubList);
} else {
sublistSize--;
for (int i = startIndex; i < list.size(); i++) {
List<Integer> newSubList = new ArrayList<Integer>(currentSubList);
newSubList.add(list.get(i));
recursiveSublist(list, subLists, sublistSize, newSubList, i + 1);
}
}
}
我意识到您可能会进行另一个级别的递归,将子列表拆分为更小的子列表,直到达到所需数量的子列表。但是我没有看到最有效的方法,递归不是我的强项,所以我希望有人能指出我正确的方向。帮助将不胜感激。谢谢。
【问题讨论】:
-
只是为了确保我理解正确:您希望输入
{1,2,3,4,5}和k=2以返回:{1},{2,3,4,5}、{1,2},{3,4,5}、{1,2,3},{4,5}、{1,2,3,4},{5}。将输入分成 2 组的 4 种组合。由于每个组(例如{1,2})是一个List,那么每个组合都是一个List<List>,所以全套组合必须是一个List<List<List>>,而你的代码没有这样的列表,所以它无法提供请求的结果。 -
是的,没错。如果我的问题不清楚,我深表歉意。
标签: java algorithm list arraylist split