递归算法学习v2.3

ops/2025/1/20 14:50:03/

目标和

设置全局变量: 

class Solution {int ret,path,aim;public int findTargetSumWays(int[] nums, int target) {aim = target;dfs(nums,0);return ret;}public void dfs(int[] nums,int pos){if(pos == nums.length){if(path == aim){ret ++;}return;}path += nums[pos];dfs(nums,pos+1);path -= nums[pos];path -= nums[pos];dfs(nums,pos+1);path += nums[pos];}
}

 将path作为局部参数:

class Solution {int ret,aim;public int findTargetSumWays(int[] nums, int target) {aim = target;dfs(nums,0,0);return ret;}public void dfs(int[] nums,int pos,int path){if(pos == nums.length){if(path == aim){ret ++;}return;}dfs(nums,pos+1,path+nums[pos]);dfs(nums,pos+1,path-nums[pos]);}
}

39. 组合总和 - 力扣(LeetCode)

 法一:每一个位置都能从数组中数中选择;

class Solution {int aim;List<List<Integer>> ret;List<Integer> path;public List<List<Integer>> combinationSum(int[] nums, int target) {path = new ArrayList<>();ret = new ArrayList<>();aim = target;dfs(nums,0,0);return ret;}public void dfs(int[] nums,int pos,int sum){if(sum == aim){ret.add(new ArrayList<>(path));return;}if(sum > aim || pos == nums.length){return;}for(int i = pos;i < nums.length;i++){path.add(nums[i]);dfs(nums,i,sum+nums[i]);path.remove(path.size()-1);}}
}

 法二:针对数组中的数字的数量来进行选择;

对于一号位置元素,可以选择一个,两个,三个;

对于二号位置元素,可以选择一个,两个,三个;

。。。。。。

class Solution {int aim;List<List<Integer>> ret;List<Integer> path;public List<List<Integer>> combinationSum(int[] nums, int target) {path = new ArrayList<>();ret = new ArrayList<>();aim = target;dfs(nums,0,0);return ret;}public void dfs(int[] nums,int pos,int sum){if(sum == aim){ret.add(new ArrayList<>(path));return;}if(sum > aim || pos == nums.length){return;}for(int k = 0;k *nums[pos]<= aim;k++){if(k!=0){path.add(nums[pos]);}dfs(nums,pos+1,sum+k*nums[pos]);}for(int k = 1;k *nums[pos]<= aim;k++){path.remove(path.size()-1);}
}
}

784. 字母大小写全排列 - 力扣(LeetCode)

class Solution {StringBuffer path;List<String> ret;public List<String> letterCasePermutation(String s) {path = new StringBuffer();ret = new ArrayList<>();dfs(s,0);return ret;}public void dfs(String s,int pos){if(pos == s.length()){ret.add(path.toString());return;}char ch = s.charAt(pos);path.append(ch);dfs(s,pos+1);path.deleteCharAt(path.length()-1);if(ch < '0' || ch >'9'){char tmp = change(ch);path.append(tmp);dfs(s,pos+1);path.deleteCharAt(path.length()-1);}}public char change(char ch){if(ch >= 'a' && ch <= 'z' ) return ch-=32;else return ch += 32;}
}

526. 优美的排列 - 力扣(LeetCode) 

 

 

 

class Solution {boolean[] check;int ret; public int countArrangement(int n) {check = new boolean[n+1];//数组的小标从1开始计数dfs(n,1);return ret;}public void dfs(int n,int pos){if(pos == n+1){ret ++;return;}for(int i = 1 ; i <= n;i++){if(check[i] == false && (i % pos == 0 || pos % i == 0)){check[i] = true;dfs(n,pos+1);check[i] = false;}}}
}

51. N 皇后 - 力扣(LeetCode)

  

从行的角度来考虑问题:

 类似哈希表的策略来处理考虑当前位置能否放皇后的问题。

        1、考虑该列是否存在皇后,设置一个布尔数组,每一行有皇后就变为true。

        2、主对角线:主对角线用y=x+b表示。---->y-x=b;

        及判断该位置的函数为:

        y-x=b或者y-x+n=b+n;

      yinyongb这个定值来映射这一条主对角线

        3、副对角线:主对角线用y=-x+b表示。---->y+x=b;

        及判断该位置的函数为:

        y+x=b; 

class Solution {boolean[] checkCol,checkDig1,checkDig2;//每一列,住对角,副对角List<List<String>> ret;char[][] path;int n;public List<List<String>> solveNQueens(int n1) {n = n1;checkCol =  new boolean[n];checkDig1 = new boolean[n*2];checkDig2 = new boolean[n*2];ret = new ArrayList<>();path = new char[n][n];for(int i = 0;i < n;i++){Arrays.fill(path[i],'.');}dfs(0);return ret;}public void dfs(int row){if(row == n){List<String> tmp = new ArrayList<>();for(int i = 0;i < n;i++){tmp.add(new String(path[i]));}ret.add(new ArrayList<>(tmp));}//考虑m每一列能不能放for(int col = 0;col <n;col++){//某行的该列判断能不能放if(checkCol[col] == false && checkDig1[row-col+n] == false && checkDig2[row+col] == false){path[row][col]='Q';checkCol[col]=checkDig1[row-col+n]=checkDig2[row+col] = true;dfs(row+1);//恢复path[row][col]='.';checkCol[col]=checkDig1[row-col+n]=checkDig2[row+col] = false;}}}
}

36. 有效的数独 - 力扣(LeetCode)

 

 

col[9][1]:表示第九列是否包含有1这个数字 ;

class Solution {boolean[][] row,col;boolean[][][] grid;public boolean isValidSudoku(char[][] board) {row = new boolean[9][10];col = new boolean[9][10];grid =new boolean[9][9][10];for(int i = 0;i < 9 ;i++){for(int j = 0;j <9;j++){if(board[i][j] != '.'){int num = board[i][j] -'0';if(row[i][num] || col[j][num] || grid[i/3][j/3][num]){return false;}row[i][num] = col[j][num] = grid[i/3][j/3][num] = true;}}}return true;}
}

37. 解数独 - 力扣(LeetCode)

 

class Solution {boolean[][] row,col;boolean[][][] grid;public void solveSudoku(char[][] board) {row = new boolean[9][10];col = new boolean[9][10];grid =new boolean[9][9][10];//标记数据初始化for(int i = 0;i < 9 ;i++){for(int j = 0;j <9;j++){if(board[i][j] != '.'){int num = board[i][j] -'0';row[i][num] = col[j][num] = grid[i/3][j/3][num] = true;}}}dfs(board);}public boolean dfs(char[][] board){for(int i = 0;i < 9 ;i++){for(int j = 0;j <9;j++){if(board[i][j] == '.'){//填数for(int num =1;num <= 9; num++){//剪纸if(!row[i][num] && !col[j][num] && !grid[i/3][j/3][num]){board[i][j]= (char)('0'+num);row[i][num] = col[j][num] = grid[i/3][j/3][num] = true;if(dfs(board) == true){return true;}//返回现场board[i][j] = '.';row[i][num] = col[j][num] = grid[i/3][j/3][num] = false;}}return false;}}}return true;}
}

 79. 单词搜索 - 力扣(LeetCode)

class Solution {boolean[][] vis;int m,n;char[] word;public boolean exist(char[][] board, String word1) {m= board.length;n = board[0].length;vis = new boolean[m][n];word = word1.toCharArray();for(int i = 0;i < m ;i++){for(int j = 0;j <n;j++){if(board[i][j] == word[0] ){vis[i][j] = true;if(dfs(board,i,j,1)){return true;}vis[i][j] = false;}   }}return false;}int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};public boolean dfs(char[][] board,int i,int j,int pos){if(pos == word.length){return true;}//上下左右去匹配//利用向量数组,为位置定义四个上下左右位置。for(int k = 0;k <  4;k++){int x = i + dx[k],y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && board[x][y] == word[pos]){vis[x][y] = true;if(dfs(board,x,y,pos+1)){return true;}vis[x][y] = false;} }return false;}
}

 1219. 黄金矿工 - 力扣(LeetCode)

 

class Solution {boolean[][] vis;int m,n;int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};int ret;public int getMaximumGold(int[][] g) {m = g.length;n = g[0].length;vis = new boolean[m][n];for(int i = 0;i < m ;i++){for(int j = 0;j <n;j++){if(g[i][j] !=0){vis[i][j] = true;dfs(g,i,j,g[i][j]);vis[i][j] = false;}}}return ret;}public void dfs(int[][] g,int i,int j,int path){ret =  Math.max(ret,path);for(int k = 0;k <  4;k++){int x = i + dx[k],y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && g[x][y] != 0){vis[x][y] = true;dfs(g,x,y,path+g[x][y]);vis[x][y] = false;}}}
}

980. 不同路径 III - 力扣(LeetCode) 

 

 

class Solution {boolean[][] vis;int m,n,step,ret;int[] dx={0,0,1,-1};int[] dy={1,-1,0,0};public int uniquePathsIII(int[][] grid) {m= grid.length;n = grid[0].length;vis = new boolean[m][n];    //开始位置int bx = 0;int by = 0;for(int i = 0;i < m ;i++){for(int j = 0;j <n;j++){if(grid[i][j] == 0 ){step ++;}else if(grid[i][j] == 1){bx = i;by = j;}}}step +=2;vis[bx][by] = true;dfs(grid,bx,by,1);return ret;}public void dfs(int[][] grid,int i,int j,int count){if(grid[i][j] == 2){if(count == step){ret++;}return;}for(int k = 0;k <  4;k++){int x = i + dx[k],y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] != -1){vis[x][y] = true;dfs(grid,x,y,count+1);vis[x][y] = false;} }}
} 

ps:谢谢观看。


http://www.ppmy.cn/ops/151696.html

相关文章

HTML5+Canvas实现的鼠标跟随自定义发光线条源码

源码介绍 HTML5Canvas实现的鼠标跟随自定义发光线条特效源码非常炫酷&#xff0c;在黑色的背景中&#xff0c;鼠标滑过即产生彩色变换的发光线条效果&#xff0c;且线条周围散发出火花飞射四溅的粒子光点特效。 效果预览 源码如下 <!DOCTYPE html PUBLIC "-//W3C//D…

AVL树(C++实现)

目录 1.AVL树的概念 2.AVL树的实现 2.1 AVL树结点的定义 2.2 AVL树的插入 2.3AVL树的旋转 右单旋 左单旋 左右双旋 右左双旋 2.4 AVL树的查找 2.5 AVL树的验证 2.6 AVL树的性能测验 3. 全部代码 1.AVL树的概念 二叉搜索树虽然可以提高我们查找数据的效率&#xf…

Vue项目搭建教程超详细

目录 一. 环境准备 1. 安装node.js 2. 安装Vue cli 二. 创建 Vue 2 项目 1. 命令行方式 2. vue ui方式 一. 环境准备 1. 安装node.js 可参考node.js卸载与安装超详细教程-CSDN博客 2. 安装Vue cli npm install -g vue/cli检查是否安装成功 vue --version Vue CLI …

基于springboot+vue的食物营养分析与推荐网站的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

智能新浪潮:亚马逊云科技发布Amazon Nova模型

在2024亚马逊云科技re:Invent全球大会上&#xff0c;亚马逊云科技宣布推出新一代基础模型Amazon Nova&#xff0c;其隶属于Amazon Bedrock&#xff0c;这些模型精准切入不同领域&#xff0c;解锁多元业务可能&#xff0c;为人工智能领域带来革新。 带你认识一起了解Amazon Nova…

防止 SQL 注入的技术文档

防止 SQL 注入的技术文档 概述 SQL 注入是一种常见的安全漏洞&#xff0c;攻击者通过构造恶意输入&#xff0c;操纵数据库查询&#xff0c;从而获取、篡改或删除数据。本文将详细介绍 SQL 注入的原理、危害以及如何在 Java 中有效防止 SQL 注入。 1. SQL 注入的原理与危害 1…

手摸手系列之 Java 通过 PDF 模板生成 PDF 功能

集团 SaaS 平台目前需要实现导出 PDF 格式的电子委托协议功能。业务方已经提供了一个现成的 PDF 文件作为参考。针对这一需求&#xff0c;我们有两个可行的方案&#xff1a; 完全代码生成&#xff1a;根据 PDF 文件的外观&#xff0c;完全通过代码动态生成 PDF 文件。模板填充…

PHP:写接口与接口的调用(完整版,封装公共方法)

说明&#xff1a;绑定的资源详细展示了两个项目的接口、接口调用的实现&#xff0c;已经数据库的连接&#xff0c;目录展示更加一目了然&#xff0c;有需要可以下载资源&#xff0c;实际文章已经描述的很详细了 一、A页面-发送请求页面 1、说明 发送请求部分&#xff0c;去调…