问题如下: 给定两个整数n和k,返回1 ... n中所有可能的k个数组合。
例如, 如果n = 4且k = 2,则解决方案是:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4]
]
我的解决方案是:
public List<List<Integer>> combine(int n, int k) {
Deque<List<Integer>> queue = new LinkedList<List<Integer>>();
List<List<Integer>> result = new LinkedList<List<Integer>>();
for (int i = 1; i <= n; i++) {
List<Integer> list = new ArrayList<Integer>();
list.add(i);
queue.add(list);
}
while (!queue.isEmpty()) {
List<Integer> list = queue.pollFirst();
if (list.size() == k)
result.add(list);
else {
for (int i = list.get(list.size() - 1) + 1; i <= n; i++) {
list.add(i);
queue.addLast(list);
list.remove(list.size() - 1);
}
}
}
return result;
}
然而while循环进入无限循环。我不知道逻辑有什么问题。我跟踪了几次,但仍无法找到此代码中的逻辑缺陷。
答案 0 :(得分:3)
您的问题是您多次将相同的列表实例添加到队列中,因此在您编写时:
list.add(i); // suppose that list had 1 element. After adding 1,
// it has two elements
queue.addLast(list); // here you add the list with 2 elements to
// the queue
list.remove(list.size() - 1); // here you remove the added element
// so the list you just added
// to the queue has just 1 element
您添加到队列中的列表将保留原始元素数。
在将新实例添加到队列之前,您应该创建一个新的List实例:
list.add(i);
queue.addLast(new ArrayList<Integer>(list));
list.remove(list.size() - 1);
答案 1 :(得分:0)
以上(!queue.isEmpty()){}始终为真