全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
1 2
| 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
|
示例 2:
1 2
| 输入:nums = [0,1] 输出:[[0,1],[1,0]]
|
https://leetcode.cn/problems/permutations/description/
回溯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| import java.util.ArrayList; import java.util.LinkedList; import java.util.List;
class Solution { List<List<Integer>> result = new ArrayList<>(); // 结果集(只存不改) List<Integer> path = new LinkedList<>(); // 当前分支路径(尾部增删)
public List<List<Integer>> permute(int[] nums) { boolean[] used = new boolean[nums.length]; // 同路径已用标记 backtracking(nums, used); return result; }
void backtracking(int[] nums, boolean[] used) { // 到叶子:拷贝快照后收割 if (path.size() == nums.length) { result.add(new ArrayList<>(path)); return; } // 排列:for 从 0 扫(组合用 startIndex) for (int i = 0; i < nums.length; i++) { if (used[i]) continue; // 同路径已用则跳过 used[i] = true; // 占用 path.add(nums[i]); // 进:记入尾部 backtracking(nums, used); // 递归下一层 path.removeLast(); // 退:弹尾部 used[i] = false; // 释放 } } }
|