力扣中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);
    }

}

 

posted @ 2023-03-14 16:48  Ssshiny  阅读(15)  评论(0)    收藏  举报