Day25-回溯

LeetCode491.递增子序列

	List<List<Integer>> dp = new ArrayList<>();
	List<Integer> path = new ArrayList<>();
	Set<List<Integer>> set = new HashSet<>();
	
	public void dfs(int[] nums, int index) {
		if(path.size()>1) {
			set.add(new ArrayList<>(path));
		}
		if(index>=nums.length) {
			return ;
		}
		
		int[] used = new int[201];
		for(int i=index;i<nums.length;i++) {
			if(path.size()!=0&&path.get(path.size()-1)>nums[i]||used[nums[i]+100]==1) {
				continue;
			}
			used[nums[i]+100]=1;
			path.add(nums[i]);
			dfs(nums,i+1);
			path.remove(path.size()-1);
		}
	}
	
    public List<List<Integer>> findSubsequences(int[] nums) {
    	if(nums.length==0) return dp;
    	dfs(nums,0);
    	dp.addAll(set);
    	return dp;
    }

LeetCode46.全排列

	List<List<Integer>> dp = new ArrayList<>();
	List<Integer> path = new ArrayList<>();
    boolean[] used = new boolean[7];

	public void dfs(int[]nums) {
		if(path.size()>=nums.length) {
			dp.add(new ArrayList<>(path));
			return;
		}
		
		for(int i=0;i<nums.length;i++) {
			if(used[i]) continue;
			used[i]=true;
			path.add(nums[i]);
			dfs(nums);
			path.remove(path.size()-1);
			used[i]=false;
		}
	}
	
    public List<List<Integer>> permute(int[] nums) {
    	if(nums.length==0) return dp;
    	dfs(nums);
    	return dp;
    }

LeetCode47.全排列 II

	List<List<Integer>> dp = new ArrayList<>();
	List<Integer> path = new ArrayList<>();
	
	boolean[] used = new boolean[8];
	
	public void dfs(int[] nums) {
		if(path.size()==nums.length) {
			dp.add(new ArrayList<>(path));
			return;
		}
		
		for(int i=0;i<nums.length;i++) {
			if(used[i]) continue;
			if(i>0&&nums[i-1]==nums[i]&& used[i - 1] == false) continue;
			used[i]=true;
			path.add(nums[i]);
			dfs(nums);
			path.remove(path.size()-1);
			used[i]=false;
		}
	}
	
    public List<List<Integer>> permuteUnique(int[] nums) {
    	if(nums.length==0) return dp;
    	Arrays.sort(nums);
    	dfs(nums);
    	return dp;
    }

Leetcode51.N皇后

	List<List<String>> dp = new ArrayList<>();
	
	public void dfs(char[][]chessboard,int n,int row) {
		if(row>=n) {
			//放置n皇后方法
			dp.add(Array2List(chessboard));
			return;
		}
		
		for(int i=0;i<n;i++) {
			if(isValid(chessboard,n,row,i)) {
				chessboard[row][i]='Q';
				dfs(chessboard,n,row+1);
				chessboard[row][i]='.';
			}
		}
	}
	
    public List<String> Array2List(char[][] chessboard) {
        List<String> list = new ArrayList<>();

        for (char[] c : chessboard) {
            list.add(String.copyValueOf(c));
        }
        return list;
    }
	
	public boolean isValid(char[][] chessboard,int n,int row,int i) {
		//本行中是否有其他皇后
		for(int k=0;k<n;k++) {
			if(k==i)continue;
			if(chessboard[row][k]=='Q') return false;
		}
		//本列中是否有其他皇后
		for(int k=0;k<n;k++) {
			if(k==row)continue;
			if(chessboard[k][i]=='Q') return false;
		}
		
		//左上到右下对角线
		int k=row+1,q=i+1;
		while(k<n&&q<n) {
			if(chessboard[k][q]=='Q') return false;
			k++;
			q++;
		}
		
		k=row-1;
		q=i-1;
		while(k>=0&&q>=0) {
			if(chessboard[k][q]=='Q') return false;
			k--;
			q--;
		}
		
		//右上到左下对角线
		k=row-1;
		q=i+1;
		while(k>=0&&q<n) {
			if(chessboard[k][q]=='Q') return false;
			k--;
			q++;
		}
		
		k=row+1;
		q=i-1;
		while(k<n&&q>=0) {
			if(chessboard[k][q]=='Q') return false;
			k++;
			q--;
		}
		return true;
	}
	
    public List<List<String>> solveNQueens(int n) {
    	if(n==0) return dp;
        char[][] chessboard = new char[n][n];
        for (char[] c : chessboard) {
            Arrays.fill(c, '.');
        }
        
        dfs(chessboard,n,0);
        
        return dp;
        
    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值