Android学习总结之算法篇七(图和矩阵)
有向图的深度优先搜索(DFS)和广度优先搜索(BFS)的示例,以此来模拟遍历 GC Root 引用链这种有向图结构:
一、深度优先搜索(DFS)
import java.util.*;public class GraphDFS {private final int V; // 顶点数量private final LinkedList<Integer>[] adj; // 邻接表// 构造函数GraphDFS(int v) {V = v;adj = new LinkedList[v];for (int i = 0; i < v; ++i)adj[i] = new LinkedList<>();}// 添加边void addEdge(int v, int w) {adj[v].add(w);}// 深度优先搜索辅助函数void DFSUtil(int v, boolean[] visited) {// 标记当前节点为已访问并打印visited[v] = true;System.out.print(v + " ");// 递归访问所有邻接节点Iterator<Integer> i = adj[v].listIterator();while (i.hasNext()) {int n = i.next();if (!visited[n])DFSUtil(n, visited);}}// 深度优先搜索void DFS(int v) {// 标记所有节点为未访问boolean[] visited = new boolean[V];DFSUtil(v, visited);}public static void main(String[] args) {GraphDFS g = new GraphDFS(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 0);g.addEdge(2, 3);g.addEdge(3, 3);System.out.println("从顶点 2 开始的深度优先搜索结果:");g.DFS(2);}
}
二、广度优先搜索(BFS)
import java.util.*;public class GraphBFS {private final int V; // 顶点数量private final LinkedList<Integer>[] adj; // 邻接表// 构造函数GraphBFS(int v) {V = v;adj = new LinkedList[v];for (int i = 0; i < v; ++i)adj[i] = new LinkedList<>();}// 添加边void addEdge(int v, int w) {adj[v].add(w);}// 广度优先搜索void BFS(int s) {// 标记所有节点为未访问boolean[] visited = new boolean[V];// 创建一个队列用于 BFSLinkedList<Integer> queue = new LinkedList<>();// 标记当前节点为已访问并加入队列visited[s] = true;queue.add(s);while (queue.size() != 0) {// 出队并打印s = queue.poll();System.out.print(s + " ");// 获取所有邻接节点Iterator<Integer> i = adj[s].listIterator();while (i.hasNext()) {int n = i.next();if (!visited[n]) {visited[n] = true;queue.add(n);}}}}public static void main(String[] args) {GraphBFS g = new GraphBFS(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 0);g.addEdge(2, 3);g.addEdge(3, 3);System.out.println("从顶点 2 开始的广度优先搜索结果:");g.BFS(2);}
}
代码解释
- 深度优先搜索(DFS):通过递归的方式,尽可能深地访问图中的节点。在访问一个节点后,标记其为已访问,然后递归地访问其未被访问的邻接节点。
- 广度优先搜索(BFS):使用队列来实现,从起始节点开始,将其标记为已访问并加入队列。然后不断从队列中取出节点,访问其未被访问的邻接节点,并将这些邻接节点加入队列。
三、蛇形打印矩阵
import java.util.ArrayList;
import java.util.List;public class ZigzagMatrixPrinter {/*** 以蛇形顺序打印矩阵元素* @param matrix 输入的二维矩阵* @return 包含蛇形顺序元素的列表*/public static List<Integer> zigzagOrder(int[][] matrix) {// 用于存储最终蛇形打印结果的列表List<Integer> result = new ArrayList<>();// 检查输入的矩阵是否为空或无效// 如果矩阵为空,或者矩阵没有行,或者矩阵的第一行没有元素,直接返回空列表if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {return result;}// 获取矩阵的行数int rows = matrix.length;// 获取矩阵的列数int cols = matrix[0].length;// 遍历矩阵的每一行for (int i = 0; i < rows; i++) {// 判断当前行是否为偶数行(行索引从 0 开始,所以索引为偶数的行是偶数行)if (i % 2 == 0) {// 偶数行从左到右打印// 遍历当前行的每一列for (int j = 0; j < cols; j++) {// 将当前元素添加到结果列表中result.add(matrix[i][j]);}} else {// 奇数行从右到左打印// 从当前行的最后一列开始,逆序遍历到第一列for (int j = cols - 1; j >= 0; j--) {// 将当前元素添加到结果列表中result.add(matrix[i][j]);}}}// 返回存储蛇形打印结果的列表return result;}public static void main(String[] args) {// 定义一个示例矩阵int[][] matrix = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};// 调用 zigzagOrder 方法进行蛇形打印,并将结果存储在 result 列表中List<Integer> result = zigzagOrder(matrix);// 打印蛇形打印的结果System.out.println(result);}
}
四、顺时针打印矩阵(螺旋打印)
import java.util.ArrayList;
import java.util.List;public class SpiralPrintMatrix {public static void main(String[] args) {// 定义一个二维数组表示矩阵int[][] matrix = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};// 调用螺旋打印矩阵的方法,得到打印结果列表List<Integer> result = spiralOrder(matrix);// 遍历结果列表,打印每个元素for (int num : result) {System.out.print(num + " ");}}/*** 以螺旋顺序(顺时针)遍历矩阵的方法* @param matrix 要遍历的矩阵* @return 包含螺旋遍历结果的列表*/public static List<Integer> spiralOrder(int[][] matrix) {// 用于存储螺旋遍历结果的列表List<Integer> result = new ArrayList<>();// 检查矩阵是否为空或无效,如果是则直接返回空列表if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {return result;}// 获取矩阵的行数int rows = matrix.length;// 获取矩阵的列数int cols = matrix[0].length;// 初始化左边界为 0int left = 0;// 初始化右边界为列数减 1int right = cols - 1;// 初始化上边界为 0int top = 0;// 初始化下边界为行数减 1int bottom = rows - 1;// 当左边界小于等于右边界且上边界小于等于下边界时,继续循环while (left <= right && top <= bottom) {// 从左到右打印上边界的元素for (int j = left; j <= right; j++) {result.add(matrix[top][j]);}// 上边界向下移动一行top++;// 从上到下打印右边界的元素for (int i = top; i <= bottom; i++) {result.add(matrix[i][right]);}// 右边界向左移动一列right--;// 检查上边界是否仍然小于等于下边界if (top <= bottom) {// 从右到左打印下边界的元素for (int j = right; j >= left; j--) {result.add(matrix[bottom][j]);}// 下边界向上移动一行bottom--;}// 检查左边界是否仍然小于等于右边界if (left <= right) {// 从下到上打印左边界的元素for (int i = bottom; i >= top; i--) {result.add(matrix[i][left]);}// 左边界向右移动一列left++;}}// 返回包含螺旋遍历结果的列表return result;}
}
五、矩阵置零
/*** 将矩阵中值为 0 的元素所在的行和列的所有元素都置为 0* * @param matrix 输入的二维矩阵*/
public void setZeroes(int[][] matrix) {// 获取矩阵的行数int m = matrix.length;// 获取矩阵的列数int n = matrix[0].length;// 标记第一行是否原本就存在 0boolean firstRowHasZero = false;// 标记第一列是否原本就存在 0boolean firstColHasZero = false;// 检查第一行是否有 0for (int j = 0; j < n; j++) {if (matrix[0][j] == 0) {// 如果第一行存在 0,将标记置为 truefirstRowHasZero = true;// 一旦发现 0,无需继续检查该行其他元素,跳出循环break;}}// 检查第一列是否有 0for (int i = 0; i < m; i++) {if (matrix[i][0] == 0) {// 如果第一列存在 0,将标记置为 truefirstColHasZero = true;// 一旦发现 0,无需继续检查该列其他元素,跳出循环break;}}// 标记需要置为 0 的行和列// 从第二行第二列开始遍历矩阵(避开第一行和第一列,因为它们用于标记)for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (matrix[i][j] == 0) {// 如果当前元素为 0,将该元素所在行的第一个元素置为 0,标记该行需要置 0matrix[i][0] = 0;// 如果当前元素为 0,将该元素所在列的第一个元素置为 0,标记该列需要置 0matrix[0][j] = 0;}}}// 根据标记置 0// 再次从第二行第二列开始遍历矩阵for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (matrix[i][0] == 0 || matrix[0][j] == 0) {// 如果当前元素所在行的第一个元素为 0 或者所在列的第一个元素为 0,将该元素置为 0matrix[i][j] = 0;}}}// 处理第一行if (firstRowHasZero) {// 如果第一行原本就有 0,将第一行所有元素置为 0for (int j = 0; j < n; j++) {matrix[0][j] = 0;}}// 处理第一列if (firstColHasZero) {// 如果第一列原本就有 0,将第一列所有元素置为 0for (int i = 0; i < m; i++) {matrix[i][0] = 0;}}
}
六、拿两堆宝石,保证会赢
问题分析
这是一个典型的博弈论问题,目标是通过策略确保先手必胜。关键在于通过第一步操作使两堆宝石数量相等,之后采取对称策略(对方从某堆拿 k 个,自己从另一堆拿 k 个),最终自己拿完最后一个宝石。
必胜策略
- 初始状态:两堆宝石数量为
12和13,差值为1。 - 第一步操作:从数量为
13的堆中拿走1个,使两堆均为12个,形成对称状态。 - 后续策略:对方从某一堆拿
k个(1≤k≤3),自己从另一堆拿k个,始终保持两堆数量相等,最终自己拿完最后一个宝石。
Java 代码实现
public class StoneGameStrategy {public static void main(String[] args) {int pile1 = 12;int pile2 = 13;// 先手第一步操作:使两堆数量相等int firstMove = Math.abs(pile1 - pile2);if (pile1 < pile2) {pile2 -= firstMove;} else {pile1 -= firstMove;}System.out.println("第一步从数量为 " + (pile1 + firstMove) + " 的堆中拿 " + firstMove + " 个");System.out.println("剩余两堆数量:" + pile1 + " 和 " + pile2);System.out.println("之后对方拿k个,自己从另一堆拿k个,确保最终获胜");}
}
代码解释
- 计算初始差值:通过
Math.abs(pile1 - pile2)计算两堆宝石数量的差值,初始差值为1。 - 调整数量:从数量多的堆中拿走差值个宝石(本例中从
13个的堆拿1个),使两堆数量相等(均为12个)。 - 对称策略:后续对方每次从某一堆拿
k个,自己从另一堆拿k个,始终保持两堆数量相等,最终自己拿完最后一个宝石,确保胜利。
结论
先手第一步从数量为 13 的堆中拿走 1 个宝石,之后采取对称策略,即可保证必胜。
相关文章:
Android学习总结之算法篇七(图和矩阵)
有向图的深度优先搜索(DFS)和广度优先搜索(BFS)的示例,以此来模拟遍历 GC Root 引用链这种有向图结构: 一、深度优先搜索(DFS) import java.util.*;public class GraphDFS {privat…...
docker 大模型
使用 Docker 实现大模型的步骤指南 在今天的文章中,我们将指导刚入行的小白如何使用 Docker 来运行大模型。Docker 是一个开放源代码的平台,允许开发者自动化应用程序的部署、扩展和管理。通过将大模型放入 Docker 容器中,我们可以确保其在各…...
热门与冷门并存,25西电—电子工程学院(考研录取情况)
1、电子工程学院各个方向 2、电子工程学院近三年复试分数线对比 学长、学姐分析 由表可看出: 1、电子科学与技术25年相较于24年上升20分 2、信息与通信工程、控制科学与工程、新一代电子信息技术(专硕)25年相较于24年下降25分 3、25vs24推…...
Warcraft Logs [Classic] [WCL] BOSS ID query
Warcraft Logs [Classic] [WCL] BOSS ID query 所有副本BOSSID查询 https://wowpedia.fandom.com/wiki/DungeonEncounterID#Retail IDNameMapInstanceIDPatch227High Interrogator GerstahnBlackrock Depths230228Lord RoccorBlackrock Depths230229Houndmaster GrebmarBlackro…...
python录屏工具实现
python录屏工具实现 实现一 按Ctrl+Shift+8开始录制,按Ctrl+Shift+9结束录制,视频保存到“ d:\录屏视频”目录中。 先看用了哪些库 import cv2: 引入 OpenCV 库,这是一个开源计算机视觉库,用于图像和视频处理。在这个程序中,它用于创建视频文件、处理图像等。需要安装ope…...
架构师面试(三十一):IM 消息收发逻辑
问题 今天聊一下 IM 系统最核心的业务逻辑。 在上一篇短文《架构师面试(三十):IM 分层架构》中详细分析过,IM 水平分层架构包括:【入口网关层】、【业务逻辑层】、【路由层】和【数据访问层】;除此之外&a…...
基于若依框架前后端分离的项目部署
文章目录 单项目的部署项目目录后端打包上传前端打包上传配置nginx服务器打开防火墙完成 两个项目的部署两个项目介绍后端打包并上传前端打包并上传nginx配置服务器端口开放完成 腾讯云服务器 之 环境搭建 单项目的部署 项目目录 后端打包上传 查看端口号 在ruoyi-admin的appl…...
黑马Java基础笔记-1
JVM,JDK和JRE JDK是java的开发环境 JVM虚拟机:Java程序运行的地方 核心类库:Java已经写好的东西,我们可以直接用。 System.out.print中的这些方法就是核心库中的所包含的 开发工具: javac(编译工具)、java&…...
面向新一代扩展现实(XR)应用的物联网框架
中文标题: 面向新一代扩展现实(XR)应用的物联网框架 英文标题: Towards an IoT Framework for the New Generation of XR Applications 作者信息 Joo A. Dias,UNIDCOM - IADE,欧洲大学,里斯本&…...
pcl各模块
参考资料: https://github.com/Ewenwan/MVision/blob/master/PCL_APP/1_%E7%82%B9%E4%BA%91%E6%BB%A4%E6%B3%A2filter.md 点云库PCL各模块学习 语雀 各模块依赖关系: 模块: common pcl_common中主要是包含了PCL库常用的公共数据结构和方…...
Oracle Recovery Tools修复ORA-600 6101/kdxlin:psno out of range故障
数据库异常断电,然后启动异常,我接手该库,尝试recover恢复 SQL> recover database; ORA-10562: Error occurred while applying redo to data block (file# 2, block# 63710) ORA-10564: tablespace SYSAUX ORA-01110: ???????? 2: H:\TEMP\GDLISNET\SYSAUX01.DBF O…...
Python网络编程从入门到精通:Socket核心技术+TCP/UDP实战详解
引言 网络编程是构建现代分布式系统的核心能力,而Socket作为通信的基石,其重要性不言而喻。本文将从零开始,通过清晰的代码示例、原理剖析和对比分析,带你彻底掌握Python中的Socket编程技术,涵盖TCP可靠连接、UDP高效…...
2025MathorcupC题 音频文件的高质量读写与去噪优化 保姆级教程讲解|模型讲解
2025Mathorcup数学建模挑战赛(妈妈杯)C题保姆级分析完整思路代码数据教学 C题:音频文件的高质量读写与去噪优化 随着数字媒体技术的迅速发展,音频处理成为信息时代的关键技术之一。在日常生活中,从录音设备捕捉的原始…...
.net core web api 数据验证(DataAnnotations)
目录 一、什么是 DataAnnotations? 二、扩展验证逻辑(自定义验证器) 一、什么是 DataAnnotations? DataAnnotations 是一组特性(Attributes),用于在模型类上定义验证规则。主要用于属性级别的…...
【工具-Krillin AI】视频翻译、配音、语音克隆于一体的一站式视频多语言转换工具~
Krillin AI 是全能型音视频本地化与增强解决工具。这款简约而强大的工具,集音视频翻译、配音、语音克隆于一身,支持横竖屏格式输出,确保在所有主流平台(哔哩哔哩,小红书,抖音,视频号,…...
ICPR-2025 | 让机器人在未知环境中 “听懂” 指令精准导航!VLTNet:基于视觉语言推理的零样本目标导航
作者:Congcong Wen, Yisiyuan Huang, Hao Huang ,Yanjia Huang, Shuaihang Yuan, YuHao, HuiLin and Yi Fang 单位:纽约大学阿布扎比分校具身人工智能与机器人实验室,纽约大学阿布扎比分校人工智能与机器人中心,纽约大学坦登工程…...
Shiro-550 动调分析与密钥正确性判断
一、Shiro 简介 Apache Shiro是一个开源安全框架,用于构建 Java 应用程序,提供身份验证、授权、加密和会话管理等功能。 二、Shiro-550(CVE-2016-4437) 1、漏洞原理 Shiro 在用户登陆时提供可选项 RememberMe,若勾选…...
Python制作简易PDF查看工具PDFViewerV1.0查找功能优化
原文说明 为不破坏原文结构,因此功能优化不在原文中维护了。关于这款工具原文请通过下面链接访问。Python制作简易PDF查看工具PDFViewerV1.0 这款小工具基本功能已经可以作为一款文档浏览器使用,但还有一些美中不足的地方,本文将介绍对文本查…...
20250419将405的机芯由4LANE的LVDS OUT配置为8LANE的步骤
20250419将405的机芯由4LANE的LVDS OUT配置为8LANE的步骤 2025/4/19 15:38 查询格式YUV/RGB 81 09 04 24 60 FF 90 50 00 00 FF 查询辨率帧率 81 09 04 24 72 FF 90 50 01 03 FF 查询LVDS mode : Singel output/Dual output 81 09 04 24 74 FF 90 50 00 00 FF 配置405的机…...
从0开发一个unibest+vue3项目,使用vscode编辑器开发,总结vue2升vue3项目开始,小白前期遇到的问题
开头运行可看官网 链接: unibest官网 一:vscode中vue3代码显示报错标红波浪线 去查看扩展商店发现一些插件都弃用了,例如h5的插件以及vue老插件 解决办法:下载Vue - Official插件(注意:横杠两边是要加空格的ÿ…...
Jinja2模板引擎SSTI漏洞
1. 引入 再研究大模型相关应用的漏洞CVE-2025-25362时(参考1),看到作者给了比较详细的分析(参考2)。下面对这个漏洞做个介绍。 2. 漏洞类型 这个漏洞属于CWE-1336,它主要关注在使用模板引擎进行脚本化处…...
HTML5好看的水果蔬菜在线商城网站源码系列模板4
文章目录 1.设计来源1.1 主界面1.2 关于我们1.3 商品信息1.4 新闻资讯1.5 联系我们1.5 登录注册 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/147264262 HTML5好看的水果…...
Python语法系列博客 · 第6期[特殊字符] 文件读写与文本处理基础
上一期小练习解答(第5期回顾) ✅ 练习1:字符串反转模块 string_tools.py # string_tools.py def reverse_string(s):return s[::-1]调用: import string_tools print(string_tools.reverse_string("Hello")) # 输出…...
多人五子棋联机对战平台 测试报告
目录 项目介绍 测试用例设计 部分功能测试示例 自动化测试 测试范围 排除范围 自动化测试目录编辑 执行全部自动化测试用例 性能说明 总结 性能测试 结果分析 测试总结 项目介绍 该项目基于WebSocket实现实时通信,采用SSM框架构建在线五子棋多人联机…...
docker基本使用命令
一、镜像 1、拉取镜像 docker pull busybox docker pull nginx:1.26-alpine 2、查看本地镜像 [rootRocky-1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 4e1b6bae1e48 18 hours ago 192MB busybox lates…...
欣佰特携数十款机器人相关前沿产品,亮相第二届人形机器人和具身智能行业盛会
2025年4月15日至16日,备受关注的第二届中国人形机器人与具身智能产业大会已在北京成功举行。作为国内前沿科技及产品服务领域的重要参与者,欣佰特科技携众多前沿产品精彩亮相,全方位展示了其在人形机器人与具身智能领域的创新产品。 在本次大…...
windows安装hadoop-3.3.5(图文教程)
本章教程,记录在Windows操作系统上安装hadoop-3.3.5的整个过程。 一、基础环境准备 JDK版本:java version “1.8.0_431” ,并且配置JAVA_HOME系统环境变量 hadoop版本:3.3.5,配置HADOOP_HOME系统环境变量。 下载地址:https://archive.apache.org/dist/hadoop/common/hado…...
【eNSP实验】OSPF单区域配置
简介 OSPF(开放最短路径优先)是一种基于链路状态算法的内部网关协议(IGP),用于自治系统内部动态路由。其核心机制为:各路由器通过泛洪链路状态通告(LSA)同步网络拓扑,构…...
从 SQL2API 到 Text2API:开启数据应用开发的新征程
在技术革新浪潮的席卷下,数据应用开发领域正经历着深刻变革。曾经,构建数据 API 需要开发者具备扎实的数据库知识和编程技能,手动编写复杂的 SQL 查询与 API 代码,这一过程不仅耗时费力,还将众多非技术人员阻挡在数据应…...
4月18日日记(补)
昨天玩的太疯狂了最后也没来得及写日记,补上() 正常的早八微积分,英语,下午的思政课非常的疯狂啊,因为是代课老师,她给我们很多机会强大加分,大家都知道这是一个追分的好机会&#x…...
