牛客网【面试必刷TOP101】~ 06 递归/回溯
牛客网【面试必刷TOP101】~ 06 递归/回溯
文章目录
- 牛客网【面试必刷TOP101】~ 06 递归/回溯
- @[toc]
- BM55 没有重复项数字的全排列(★★)
- BM56 有重复项数字的全排列(★★)
- BM57 岛屿数量(★★)
- BM58 字符串的排列(★★)
- BM59 N皇后问题(★★★)
- BM60 括号生成(★★)
- BM61 矩阵最长递增路径(★★)
文章目录
- 牛客网【面试必刷TOP101】~ 06 递归/回溯
- @[toc]
- BM55 没有重复项数字的全排列(★★)
- BM56 有重复项数字的全排列(★★)
- BM57 岛屿数量(★★)
- BM58 字符串的排列(★★)
- BM59 N皇后问题(★★★)
- BM60 括号生成(★★)
- BM61 矩阵最长递增路径(★★)
BM55 没有重复项数字的全排列(★★)
回溯,移动元素至前
public class Solution {ArrayList<ArrayList<Integer>> res;public ArrayList<ArrayList<Integer>> permute (int[] nums) {res = new ArrayList<>();if (nums == null || nums.length == 0) return res;ArrayList<Integer> lists = new ArrayList<>();// Arrays.sort(nums);for (int num : nums) lists.add(num);backtrack(lists, 0, lists.size());return res;} private void backtrack(ArrayList<Integer> lists, int begin, int end) {if (begin == end) {res.add(new ArrayList<>(lists));return;}for (int i = begin; i < end; i++) {int val = lists.remove(i);lists.add(begin, val);backtrack(lists, begin + 1, end);val = lists.remove(begin);lists.add(i, val);}}
}
BM56 有重复项数字的全排列(★★)
排序+ 回溯+set去重
public class Solution {ArrayList<ArrayList<Integer>> res;public ArrayList<ArrayList<Integer>> permuteUnique (int[] nums) {res = new ArrayList<>();if (nums == null || nums.length == 0) return res;ArrayList<Integer> lists = new ArrayList<>();Arrays.sort(nums);for (int num : nums) lists.add(num);backtrack(lists, 0, lists.size());return res;}private void backtrack(ArrayList<Integer> lists, int begin, int end) {if (begin == end) {res.add(new ArrayList<>(lists));return;}Set<Integer> set = new HashSet<>();for (int i = begin; i < end; i++) {if (set.contains(lists.get(i))) continue;set.add(lists.get(i));int val = lists.remove(i);lists.add(begin, val);backtrack(lists, begin + 1, end);lists.remove(begin);lists.add(i, val);}}}
BM57 岛屿数量(★★)
方法一:回溯(120ms)
public class Solution {private static int[] dirs = {-1, 0, 1, 0, -1}; public int solve (char[][] grid) {if (grid == null || grid.length == 0 || grid[0].length == 0) return 0;int count = 0;int r = grid.length, c = grid[0].length;for (int i = 0; i < r; i++) {for (int j = 0; j < c; j++) {if (grid[i][j] == '0') continue;dfs(grid, i, j, r, c);count++;}}return count;}private void dfs(char[][] grid, int i, int j, int r, int c) {if (i < 0 || j < 0 || i >= r || j >= c || grid[i][j] == '0') {return;}grid[i][j] = '0';for (int d = 0; d < 4; d++) {int x = i + dirs[d], y = j + dirs[d + 1];dfs(grid, x, y, r, c);}}}
更直观的定义
public class Solution {public int solve (char[][] grid) {int count = 0;for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {if (grid[i][j] == '0') continue;sinkLand(grid, i, j);count++;}}return count;}private void sinkLand(char[][] grid, int i, int j) {if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == '0') {return;}grid[i][j] = '0';sinkLand(grid, i - 1, j);sinkLand(grid, i + 1, j);sinkLand(grid, i, j - 1);sinkLand(grid, i, j + 1);}}
BM58 字符串的排列(★★)
同BM56,有重复字符的全排列
public class Solution {ArrayList<String> res;public ArrayList<String> Permutation (String str) {res = new ArrayList<>();if (str == null || str.equals("")) return res;char[] cs = str.toCharArray();Arrays.sort(cs);backtrack(cs, 0, cs.length);return res;}private void backtrack(char[] cs, int begin, int end) {if (begin == end) {res.add(new String(cs));return;}Set<Character> set = new HashSet<>();for (int i = begin; i < end; i++) {if (set.contains(cs[i])) continue;set.add(cs[i]);swap(cs, begin, i);backtrack(cs, begin + 1, end);swap(cs, begin, i);}}private void swap(char[] cs, int i, int j) {char c = cs[i];cs[i] = cs[j];cs[j] = c;}
}
BM59 N皇后问题(★★★)
public class Solution {private int count;private int[] x;public int Nqueen (int n) {count = 0;x = new int[n];Arrays.fill(x, -1);backtrack(n);return count;}private void backtrack(int n) {int k = 0;while (k >= 0) {x[k]++;while (x[k] < n && isClash(k)) x[k]++;if (x[k] < n && k == n - 1) count++;if (x[k] < n && k < n - 1) {k++;} else {x[k--] = -1;}}}private boolean isClash(int k) {for (int i = 0; i < k; i++) {if (x[i] == x[k] || Math.abs(i - k) == Math.abs(x[i] - x[k])) {return true;}}return false;}}
BM60 括号生成(★★)
递归
public class Solution {public ArrayList<String> res;public ArrayList<String> generateParenthesis (int n) {res = new ArrayList<>();dfs(new String(), n, n);return res;}private void dfs(String s, int le, int ri) {if (le > ri || le < 0 || ri < 0) return;if (le == 0 && ri == 0) {res.add(s);return;}dfs(s + "(", le - 1, ri);dfs(s + ")", le, ri - 1);}
}
BM61 矩阵最长递增路径(★★)
dfs+记忆化搜索
public class Solution {private static final int[] dirs = {-1, 0, 1, 0, -1};private int[][] ms;private int R, C;public int solve (int[][] matrix) {if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {return 0;}R = matrix.length;C = matrix[0].length;ms = new int[R][C];int res = 0;for (int i = 0; i < R; i++) {for (int j = 0; j < C; j++) {res = Math.max(res, dfs(matrix, i, j));} }return res;}private int dfs(int[][] matrix, int i, int j) {if (ms[i][j] != 0) return ms[i][j];ms[i][j]++;for (int k = 0; k < 4; k++) {int x = i + dirs[k], y = j + dirs[k + 1];if (x < 0 || y < 0 || x >= R || y >= C || matrix[i][j] >= matrix[x][y]) {continue;}ms[i][j] = Math.max(ms[i][j], dfs(matrix, x, y) + 1);}return ms[i][j];}}
相关文章:
牛客网【面试必刷TOP101】~ 06 递归/回溯
牛客网【面试必刷TOP101】~ 06 递归/回溯 文章目录 牛客网【面试必刷TOP101】~ 06 递归/回溯[toc]BM55 没有重复项数字的全排列(★★)BM56 有重复项数字的全排列(★★)BM57 岛屿数量(★★)BM58 字符串的排列(★★)BM59 N皇后问题(★★★)BM60 括号生成(★★)BM61 矩阵最长递增路…...
ArcGIS Pro基础:【划分】工具实现等比例、等面积、等宽度划分图形操作
本次介绍【划分】工具的使用,如下所示,为该工具所处位置。使用该工具可以实现对某个图斑的等比例面积划分、相等面积划分和相等宽度划分。 【等比例面积】:其操作如下所示,其中: 1表示先选中待处理的图斑,2…...
括号匹配问题:栈的巧妙应用与代码优化【栈、优化、哈希表】
当解决算法问题时,灵活使用数据结构是至关重要的。在这个问题中,我们需要判断一个只包含括号的字符串是否有效,即括号是否能够正确匹配和闭合。使用栈这一数据结构可以很好地解决这个问题。 题目链接:有效的括号 解题思路…...
vue项目正确使用样式deep穿透
经常开发前端的程序员应该都知道前端一般都是组件化开发,为了避免样式污染通常会使用scoped添加属性选择器,此时如果我们想在父组件中修改子组件的样式便成了难题。其实,我们可以通过以下几种方式修改子组件样式, 组件样式穿透 …...
Jenkins持续集成-快速上手
Jenkins持续集成-快速上手 注:Jenkins一般不单独使用,而是需要依赖代码仓库,构建工具等。 搭配组合:GitGitee(GitHub、GitLab)MavenJenkins 前置准备 常见安装方式: war包Docker容器实例&…...
查看linux 所有运行的应用和端口命令
要查看 Linux 中所有运行的应用程序及其对应的端口,可以使用以下命令: 1. 使用 netstat 命令(已被弃用,建议使用 ss 命令): netstat -tuln 这会显示当前系统上所有打开的网络连接和监听的端口。其中&#…...
Maven安装与配置,Eclipse配置Maven【图文并茂的保姆级教程】
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Maven的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Maven是什么? 二.Maven的下…...
利用XLL文件投递Qbot银行木马的钓鱼活动分析
1概述 近期,安天CERT发现了一起利用恶意Microsoft Excel加载项(XLL)文件投递Qbot银行木马的恶意活动。攻击者通过发送垃圾邮件来诱导用户打开附件中的XLL文件,一旦用户安装并激活Microsoft Excel加载项,恶意代码将被执…...
2023CNSS——WEB题解(持续更新)
[Baby] SignIn 进来看到 按钮点击不了,想到去修改代码,要“检查“,但这里的右键和F12都不可用 还好还有其他方法 检查的各种方法 选用一种后进入检查页面 删掉这里的disabled即可 点击后得到flag [Baby] Backdoor 进入,…...
Unity之ShaderGraph 节点介绍 数学节点
数学 高级Absolute(绝对值)Exponential(幂)Length(长度)Log(对数)Modulo(余数)Negate(相反数)Normalize(标准化矢量&…...
springboot mongo 使用
nosql对我来说,就是用它的变动列,如果列是固定的,我为什么不用mysql这种关系型数据库呢? 所以,现在网上搜出来的大部分,用实体类去接的做法,并不适合我的需求。 所以,整理记录一下…...
如何使用appuploader制作apple证书
转载:如何使用appuploader制作apple证书 如何使用appuploader制作apple证书 一.证书管理 点击首页的证书管理 二.新建证书 点击“添加”,新建一个证书文件 免费账号制作证书只有7天有效期,没有推送消息功能,推送证书…...
Promise详细版
promise基础原理到难点分析 常见的Promise的方法解读 扩展async和await深入分析 逐步分析Promise底层逻辑代码 一、Promise基础 1.什么是promise 为了解决回调地狱: //2.设置点击事件btn.onclick function() {//3.创建ajax实例化对象let xhr new XMLHttpRe…...
v-for循环生成的盒子只改变当前选中的盒子的样式
1.给盒子添加动态属性:class"[index isActive?active-box:choose-box]" <div v-for"(item,index) in zyList" :key"item.sid" :class"[index isActive?active-box:choose-box]" click"getKmList(item,index)"…...
Spring Data JPA源码
导读: 什么是Spring Data JPA? 要解释这个问题,我们先将Spring Data JPA拆成两个部分,即Sping Data和JPA。 从这两个部分来解释。 Spring Data是什么? 摘自: https://spring.io/projects/spring-data Spring Data’s mission is to provide a familiar and cons…...
如何防止CSRF攻击
背景 随着互联网的高速发展,信息安全问题已经成为企业最为关注的焦点之一,而前端又是引发企业安全问题的高危据点。在移动互联网时代,前端人员除了传统的 XSS、CSRF 等安全问题之外,又时常遭遇网络劫持、非法调用 Hybrid API 等新…...
linuxARM裸机学习笔记(7)----RTC实时时钟实验
基础概念: I.MX6U 内部也有个RTC 模块,但是不叫作“ RTC ”,而是叫做“ SNVS ”。 SNVS 直译过来就是安全的非易性存储, SNVS 里面主要是一些低功耗的外设,包括一个 安全的实时计数器 (RTC) 、一个单调计数器 (mo…...
NSS [UUCTF 2022 新生赛]ez_upload
NSS [UUCTF 2022 新生赛]ez_upload 考点:Apache解析漏洞 开题就是标准的上传框 起手式就是传入一个php文件,非常正常的有过滤。 .txt、.user.ini、.txxx都被过滤了,应该是白名单或者黑名单加MIME过滤,只允许.jpg、.png。 猜测二…...
【操作系统】操作系统知识点总结(秋招篇)
文章目录 前言操作系统主要做了哪些工作?进程 线程 协程之间的区别进程的组成部分介绍一下进程的PCB讲一下进程的五态 以及它们的状态转移用户态和内核态是什么?进程在用户态和内核态之间是如何切换的讲一下进程之间的通信方式讲一下进程调度的三个层次介…...
篇十九:迭代器模式:遍历集合
篇十九:"迭代器模式:遍历集合" 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料&…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果