力扣中46 全排列
//可以用类似77组合那种方法 只不过加了访问数组 //也可以用官方题解来搞 设置一个正确排列后直接进行交换 public List<List<Integer>> permute(int[] nums) { int len=nums.length; List<List<Integer>> res=new ArrayList<List<Integer>>(); List<Integer> output=new ArrayList<Integer>(); for (int i:nums) { output.add(i); } backtrack(len,output,res,0);//最开始设置为1 不一样 这是数组 return res; } // 这些参数不好写啊 first是当前待排位置 public void backtrack(int n, List<Integer> output, List<List<Integer>> res, int first) { if(first==n) { res.add(new ArrayList<>(output)); // return; 这个return没必要 //对于77那种是一个一个往路里加 够了就停止后面的 现在是直接排好换序 会有现在排好的多种子情况 } for(int i=first;i<n;i++) { Collections.swap(output, first, i);//list链表的交换 不会写 backtrack(n,output,res,first+1); //这块的first我写成了i Collections.swap(output, first, i); } }
java数组默认值
隔了一天写的 用77那种方法编写回溯
package est; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List; /*给定一个不含重复数字的数组 nums ,返回其所有可能的全排列。你可以按任意顺序返回答案。*/ public class LeetcodeTest { //自己最开始写了dfs里的start位置 后来发现好像没关系!start在77里面是因为要从start开始的后面选择元素这里不需要。 public List<List<Integer>> permute(int[] nums) { int len=nums.length; List<List<Integer>> res=new ArrayList<>(); if(len==0) { return res; } Deque<Integer> path=new ArrayDeque<>(); boolean[] isvisit=new boolean[len]; dfs(len,nums,isvisit,res,path); return res; } public void dfs(int len,int[] nums,boolean[] isvisit,List<List<Integer>> res,Deque<Integer> path) { if(path.size()==len) { res.add(new ArrayList<>(path)); } for(int i=0;i<len;i++) {//这里i=0 原来自己写的i=start i是用来找填入的元素的 if(!isvisit[i]) { path.addLast(nums[i]); isvisit[i]=true; dfs(len,nums,isvisit,res,path);//start是表示前面的已经好了 标记下个待填位置的 不需要!! isvisit[i]=false; path.removeLast(); } } } public static void main(String[] args) { int[] nums = {1, 2, 3}; LeetcodeTest solution = new LeetcodeTest(); List<List<Integer>> lists = solution.permute(nums); System.out.println(lists); } }

浙公网安备 33010602011771号