全排列,出了名的回溯法解决。不多说了,直接上代码吧:
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new LinkedList<>();int[] flag = new int[nums.length];helper(result, flag, nums, new ArrayList<>(), 0);return result;}/*** * @param result 结果集,引用传递* @param flag 访问标志* @param nums 原始数组* @param parent 上一层传下来的结果* @param layer 当前处在第几层*/private void helper(List<List<Integer>> result, int[] flag, int[] nums, List<Integer> parent, int layer) {
if (layer == nums.length) {
//如果当前层已经到最后了,将上一层的结果加到结果集中result.add(parent);return;}for (int i = 0; i < nums.length; ++i) {
//遍历数组if (flag[i] == 0) {
//这个元素还没访问过List<Integer> curList = new ArrayList<>(parent); //获得上一层新数组,并加上当前未访问的元素curList.add(nums[i]);int[] newFlag = Arrays.copyOf(flag, flag.length); //获得上一层访问标志,并更新当前层的访问标志newFlag[i] = 1;helper(result, newFlag, nums, curList, layer+1); //传递到下一层}}}
}