虽然循环逻辑存在缺陷

时间:2015-06-22 19:54:03

标签: java list while-loop queue

问题如下: 给定两个整数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循环进入无限循环。我不知道逻辑有什么问题。我跟踪了几次,但仍无法找到此代码中的逻辑缺陷。

2 个答案:

答案 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()){}始终为真