递归算法学习v2.3

目标和

设置全局变量: 

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.mzph.cn/news/893191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ui设计公司分享:浅色 UI 设计

在数字化产品琳琅满目的今天&#xff0c;用户对于界面的要求早已不止于功能的实现&#xff0c;更追求一种舒适、无压的交互体验。而浅色UI设计&#xff0c;凭借其独特的魅力&#xff0c;正逐渐成为众多设计师营造优质体验的首选。 一、浅色UI设计的视觉优势 &#xff08;一&a…

Nacos:使用PgSQL数据源

数据源插件开源仓库地址&#xff1a;nacos-datasource-extend-plugins 一、PostgreSQL数据库安装 1、本文使用Docker进行数据库的安装&#xff0c;使用docker命令拉取的PG14版本的数据库&#xff1a; docker pull postgres:14.6 2、创建PG容器并启动&#xff0c;映射了5432…

Linux——入门基本指令汇总

目录 1. ls指令2. pwd3. whoami指令4. cd指令5. clear指令6. touch指令7. mkdir指令8. rm指令9. man指令10. cp指令11. mv指令12. cat指令13. tac指令14. more指令15. less指令16. head指令17. tail指令18. date指令19. cal指令20. find指令21. which指令22. alias指令23. grep…

C语言之装甲车库车辆动态监控辅助记录系统

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 C语言之装甲车库车辆动态监控辅助记录系统 目录 一、前言 1.1 &#xff08;一&#xff09;…

2024年Vue面试题汇总

流程图如下&#xff1a; vue核心知识——语法篇 1.请问 v-if 和 v-show 有什么区别&#xff1f; 相同点&#xff1a; 两者都是在判断DOM节点是否要显示。 不同点&#xff1a; a.实现方式&#xff1a; v-if是根据后面数据的真假值判断直接从Dom树上删除或重建元素节点。 v-…

centos搭建 Node.js 开发环境

Node.js &#xff0c;通常简称为Node&#xff0c;是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Chrome V8引擎&#xff0c;具备速度快、性能强等特点&#xff0c;可用于搭建各类网络应用&#xff0c;及作为小程序后端服务环境。npm 和 npx 都是和 Node.js 相关的…

DuckDB:精通Insert语句处理数据冲突

本文介绍DuckDB insert语句用法&#xff0c;包括常规的批量插入&#xff0c;尤其是插入数据冲突的处理&#xff0c;最后还提及returning子句的用法&#xff0c;每个用法提供示例说明。 insert插入数据 INSERT INTO向表中插入新行。可以插入由值表达式指定的一行或多行&#xf…

【Linux系统】Ext系列磁盘文件系统二:引入文件系统(续篇)

inode 和 block 的映射 该博文中有详细解释&#xff1a;【Linux系统】inode 和 block 的映射原理 目录与文件名 这里有几个问题&#xff1a; 问题一&#xff1a; 我们访问文件&#xff0c;都是用的文件名&#xff0c;没用过 inode 号啊&#xff1f; 之前总是说可以通过一个…

SpringBoot实现定时任务,使用自带的定时任务以及调度框架quartz的配置使用

SpringBoot实现定时任务&#xff0c;使用自带的定时任务以及调度框架quartz的配置使用 文章目录 SpringBoot实现定时任务&#xff0c;使用自带的定时任务以及调度框架quartz的配置使用一. 使用SpringBoot自带的定时任务&#xff08;适用于小型应用&#xff09;二. 使用调度框架…

flutter 使用google_mlkit_image_labeling做图片识别

在AI横行的如今&#xff0c;相信大家或多或少都做过跟AI接轨的需求了吧&#xff1f;今天我说的是关于图片识别的需求&#xff0c;flutter的专属图片识别插件google_mlkit_image_labeling。 google_mlkit_image_labeling它是Google旗下的Google Cloud Vision API中分支出来的一部…

国产编辑器EverEdit - 合并行

1 合并行 1.1 应用场景 在编写代码或其他场景下&#xff0c;有时需要把多行的内容缩减成一行&#xff0c;或者纯粹减少行数进行合并&#xff0c;比如&#xff1a;下面的字典的定义&#xff0c;每个元素占了一行&#xff0c;有点浪费&#xff0c;现在需要把它们缩减行数。 typ…

3 前端(中):JavaScript

文章目录 前言&#xff1a;JavaScript简介一、ECMAscript&#xff08;JavaScript基本语法&#xff09;1 JavaScript与html结合方式&#xff08;快速入门&#xff09;2 基本知识&#xff08;1&#xff09;JavaScript注释&#xff08;和Java注释一样&#xff09;&#xff08;2&am…

RIME-CNN-LSTM-Attention多变量多步时序预测Matlab实现

SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测 目录 SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME-CNN-LSTM-Multihead-Attention霜冰算法…

一文读懂服务器的HBA卡

什么是 HBA 卡 HBA 卡&#xff0c;全称主机总线适配器&#xff08;Host Bus Adapter&#xff09; &#xff0c;是服务器与存储装置间的关键纽带&#xff0c;承担着输入 / 输出&#xff08;I/O&#xff09;处理及物理连接的重任。作为一种电路板或集成电路适配器&#xff0c;HBA…

mfc操作json示例

首先下载cJSON,加入项目; 构建工程,如果出现, fatal error C1010: unexpected end of file while looking for precompiled head 在cJSON.c文件的头部加入#include "stdafx.h"; 看情况,可能是加到.h或者是.cpp文件的头部,它如果有包含头文件, #include &…

综述:大语言模型在机器人导航中的最新进展!

简介 机器人导航是指机器人能够在环境中自主移动和定位的能力。本文系统地回顾了基于大语言模型&#xff08;LLMs&#xff09;的机器人导航研究&#xff0c;将其分为感知、规划、控制、交互和协调等方面。具体来说&#xff0c;机器人导航通常被视为一个几何映射和规划问题&…

owasp SQL 注入-03 (原理)

1: 先看一下注入界面: 点submit 后&#xff0c;可以看到有语法报错&#xff0c;说明已经起作用了: 报如下的错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near at line 1 2:…

Vscode:问题解决办法 及 Tips 总结

Visual Studio Code&#xff08;简称VSCode&#xff09;是一个功能强大的开源代码编辑器&#xff0c;广泛用于各种编程语言和开发场景&#xff0c;本博客主要记录在使用 VSCode 进行verilog开发时遇到的问题及解决办法&#xff0c;使用过程中的技巧 文章目录 扩展安装失败调试配…

Linux(NFS服务)

赛题拓扑&#xff1a; 题目&#xff1a; NFS&#xff1a; 共享/webdata/目录。用于存储AppSrv主机的WEB数据。仅允许AppSrv主机访问该共享。 [rootstoragesrv ~]# yum install nfs-utils -y [rootstoragesrv ~]# mkdir /webdata [rootstoragesrv ~]# chmod -R ow /webdata …

c.p.api.config.MyAuthenticationProvider

文章目录 1、URL1、AdminController3、AuthenticationProvider 2025-01-15 14:21:31.017 WARN 1972 --- [nio-8087-exec-8] c.p.api.config.MyAuthenticationProvider : 管理员:13524972741 登录失败:密码错误解释: 时间戳: 2025-01-15 14:21:31.017 - 表示日志记录的时间…