Java List<List<Integer>>生成全排列及类型不兼容报错解决咨询
问题原因梳理
- 编译报错直接原因:
java.util.List的add()方法返回值为boolean类型,用于标识元素是否添加成功,你的permute方法声明返回值为List<List<Integer>>,直接返回obj2.add(obj)的执行结果会出现类型不匹配问题。 - 功能逻辑缺陷:现有代码仅将输入数组的元素存入单个列表,没有实现全排列的生成逻辑,无法输出所有排列组合的结果。
修复后完整代码
Main.java
public class Main { public static void main(String[] args) { int[] nums = {1,2,3}; Solution obj = new Solution(); // 打印结果验证输出 System.out.println(obj.permute(nums)); } }
Solution.java
import java.util.*; class Solution { // 存储最终全排列结果 List<List<Integer>> res = new ArrayList<>(); // 标记元素是否已被使用 boolean[] used; public List<List<Integer>> permute(int[] nums) { used = new boolean[nums.length]; // 启动回溯,传入临时列表存储当前构造的排列 backtrack(nums, new ArrayList<>()); return res; } private void backtrack(int[] nums, List<Integer> tempList) { // 临时列表长度等于数组长度,说明已经构造完一个完整排列 if (tempList.size() == nums.length) { // 要存临时列表的拷贝,避免后续回溯修改影响已存入的结果 res.add(new ArrayList<>(tempList)); return; } // 遍历所有元素,找未被使用的元素加入当前排列 for (int i = 0; i < nums.length; i++) { if (used[i]) { continue; } // 标记当前元素已使用 used[i] = true; tempList.add(nums[i]); // 递归构造下一个位置的元素 backtrack(nums, tempList); // 回溯:撤销标记和元素添加,尝试其他可能 tempList.remove(tempList.size() - 1); used[i] = false; } } }
运行结果
执行Main类后会输出你期望的结果:
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

