You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java回溯求数组全排列返回空ArrayList问题排查

问题原因

代码返回空结果的核心原因是Java中非基本类型采用引用传递,逻辑和Python里的列表传参完全一致:

  • 整个递归流程中你只创建了1个ans列表对象,所有递归层级操作的都是同一个对象的内存地址
  • 到达递归终止条件时,你直接把ans的引用存入了结果集fans,并没有保存当时ans内元素的独立快照
  • 后续回溯执行ans.remove(ans.size() - 1)时,会直接修改这个共享列表的内容。等全部递归流程结束,ans会被回溯操作清空,fans里存的两个引用都指向这个空列表,最终输出就是[[],[]]

你在终止条件加打印能看到正确值,是因为打印操作发生在回溯删除元素之前,当时共享列表里的元素还没被移除,但这些临时状态并没有被真正持久化到结果集中。

修复方案

不需要做复杂的深拷贝,只需要在递归终止、往结果集存值的时候,基于当前ans的内容拷贝生成一个新的列表对象存入即可,后续对原ans的修改不会影响已经存入结果的新列表。

将原dfs方法中的终止条件代码:

if (cs > ts)
{
    fans.add(ans);
    return;
}

修改为:

if (cs > ts)
{
    // 拷贝当前ans的元素生成独立新列表,存入结果集
    fans.add(new ArrayList<>(ans));
    return;
}

说明:这里用new ArrayList<>(ans)做的是浅拷贝,但由于列表中存储的Integer是不可变类型,完全满足全排列问题的使用需求,不需要额外实现深拷贝逻辑。

修改后运行测试用例[0,1]即可得到预期输出[[0,1],[1,0]]。


内容的提问来源于stack exchange,提问作者IshAsh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 00:27:42