Java中的回溯算法

回溯算法

定义:

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜素尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为回溯点。许多复杂的,规模较大的问题都可以使用回溯法。

回溯算法模板

void backtracking(参数){
   
	if(终止条件){
   
		收集结果;
		return;
	}
    //横向遍历广度
	for(集合元素){
   
		处理结点;
        //递归的深度
		递归函数;
		回溯操作;
	}
	return;
}

两道例题(力扣)

组合

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。

//示例1
输入:n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]
//示例2
输入:n = 1, k = 1
输出:[[1]]

class Solution {
   
	
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回溯算法是一种经典的搜索算法Java语言可以通过递归来实现回溯算法回溯算法通常用于求解一个问题的所有可能解或最优解。该算法通过尝试所有可能的解来解决问题,然后回溯(返回上一个状态)并尝试其他可能的解,直到找到解决方案或者所有可能的解都已经尝试过。 下面是Java实现回溯算法的一般步骤: 1. 确定问题的解空间:即确定问题的所有可能解组成的集合。 2. 确定约束条件:即问题需要满足的条件。 3. 确定搜索策略:即在问题解空间进行搜索的方式。 4. 实现回溯算法:通过递归实现,对问题的所有可能情况进行搜索,并返回找到的解或无解。 下面是一个简单的Java代码实现回溯算法的例子,该例子用回溯算法求解数独问题: ``` public class SudokuSolver { public void solveSudoku(char[][] board) { if (board == null || board.length == 0) { return; } solve(board); } private boolean solve(char[][] board) { for (int i = 0; i < board.length; i++) { for (int j = 0; j < board.length; j++) { if (board[i][j] == '.') { for (char c = '1'; c <= '9'; c++) { if (isValid(board, i, j, c)) { board[i][j] = c; if (solve(board)) { return true; } else { board[i][j] = '.'; } } } return false; } } } return true; } private boolean isValid(char[][] board, int row, int col, char c) { for (int i = 0; i < 9; i++) { if (board[i][col] != '.' && board[i][col] == c) { return false; } if (board[row][i] != '.' && board[row][i] == c) { return false; } if (board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] != '.' && board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == c) { return false; } } return true; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值