隐藏页面特效

记录一个小问题

引发错误结果的代码:

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> combine(int n, int k) {
        backTracking(n, k, 1);
        return result;
    }

    public void backTracking(int n, int k, int startIndex) {
        if (path.size() == k) {
            result.add(path);
            return;
        }

        for (int i = startIndex; i <= n; i++) {
            path.add(i);
            backTracking(n, k, i + 1);
            path.removeLast();
        }
    }
}

正确代码:

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> combine(int n, int k) {
        backTracking(n, k, 1);
        return result;
    }

    public void backTracking(int n, int k, int startIndex) {
        if (path.size() == k) {
            result.add(new ArrayList<>(path));
            return;
        }

        for (int i = startIndex; i <= n; i++) {
            path.add(i);
            backTracking(n, k, i + 1);
            path.removeLast();
        }
    }
}

原因:

在这段代码中,result 是保存最终结果的列表,path 是保存当前组合的临时列表。在回溯算法中,当找到一个满足条件的组合时,我们需要将当前的组合加入到最终结果 result 中。
由于 path 是一个 LinkedList,直接将 path 添加到 result 中会有一些问题。因为 path 最开始是一个空的 LinkedList,在回溯的过程中,不断地向其添加元素,然后又不断地移除末尾元素。所以如果直接将 path 添加到 result 中,后续的操作可能会修改 path 的内容,导致 result 中的组合也随之改变。
为了解决这个问题,我们需要将 path 添加到 result 时,创建一个新的 ArrayList 对象,将 path 的元素拷贝到新的列表中,然后将这个新的列表添加到 result 中。这样做的目的是确保 path 的内容不会随后续操作改变。因为 ArrayList 是通过拷贝的方式创建的,所以即使 path 之后被修改,添加到 result 中的组合也不会受到影响。
因此,result.add(new ArrayList<>(path)); 的作用是将当前的组合(由 path 代表)添加到 result 中并保存。


__EOF__

本文作者techgy
本文链接https://www.cnblogs.com/techgy/p/18157233.html
关于博主:I am a good person
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   AI未来10Y  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2020-04-25 最大质因数
2020-04-25 石子游戏
2020-04-25 乘积最大
2020-04-25 摆动序列
点击右上角即可分享
微信分享提示