LeetCode1706
LeetCode1706
目录
- LeetCode1706
- 题目描述
- 示例
- 题目理解
- 问题描述
- 示例分析
- 思路分析
- 问题核心
- 代码段
- 代码逐行讲解
- 1. 获取网格的列数
- 2. 初始化结果数组
- 3. 遍历每个球
- 4. 逐行模拟下落过程
- 5. 检查是否卡住
- 6. 记录结果
- 7. 返回结果数组
- 复杂度分析
- 时间复杂度
- 空间复杂度
- 总结的知识点
- 1. 二维数组的遍历
- 2. 边界检查
- 3. 条件判断
- 4. 模拟过程
- 5. 结果记录
- 整合
- 总结
题目描述
用一个大小为 m x n 的二维网格 grid 表示一个箱子。你有 n 颗球。箱子的顶部和底部都是开着的。
箱子中的每个单元格都有一个对角线挡板,跨过单元格的两个角,可以将球导向左侧或者右侧。
- 将球导向右侧的挡板跨过左上角和右下角,在网格中用 1 表示。
- 将球导向左侧的挡板跨过右上角和左下角,在网格中用 -1 表示。
在箱子每一列的顶端各放一颗球。每颗球都可能卡在箱子里或从底部掉出来。如果球恰好卡在两块挡板之间的 “V” 形图案,或者被一块挡导向到箱子的任意一侧边上,就会卡住。
返回一个大小为 n 的数组 answer ,其中 answer[i] 是球放在顶部的第 i 列后从底部掉出来的那一列对应的下标,如果球卡在盒子里,则返回 -1 。
示例
示例 1:
输入: grid = [[1,1,1,-1,-1],[1,1,1,-1,-1],[-1,-1,-1,1,1],[1,1,1,1,-1],[-1,-1,-1,-1,-1]]
输出: [1,-1,-1,-1,-1]
解释:
- 球0从第0列开始下落,最终落在第1列。
- 球1从第1列开始下落,卡在第1列和第2列之间。
- 球2从第2列开始下落,卡在第2列和第3列之间。
- 球3从第3列开始下落,卡在第3列和第4列之间。
- 球4从第4列开始下落,卡在第4列。
示例 2:
输入: grid = [[-1]]
输出: [-1]
解释:
- 球0从第0列开始下落,卡在第0列。
好的,我们将对 力扣 1706 题(球会落何处) 进行全面细致的分析,包括题目理解、解题思路、代码实现、复杂度分析以及涉及的知识点总结。通过这种方式,我们可以更深入地理解这道题目的核心逻辑和实现细节。
题目理解
问题描述
我们有一个大小为 m x n 的二维网格 grid,其中每个单元格的值可以是 1 或 -1:
1表示单元格的右上方和左下方有对角线,球会向右移动。-1表示单元格的左上方和右下方有对角线,球会向左移动。
球从网格的顶部开始下落,每个球会从第一行的某个列开始下落。球在移动过程中会遵循以下规则:
- 如果球碰到
1,它会向右移动。 - 如果球碰到
-1,它会向左移动。 - 如果球移动时碰到边界或者移动方向与相邻单元格的对角线方向不一致,球会卡住。
我们需要返回一个大小为 n 的数组,表示每个球最终会落在哪个列。如果球卡住了,则对应位置为 -1。
示例分析
输入:
grid = [[1, 1, 1, -1, -1],[1, 1, 1, -1, -1],[-1, -1, -1, 1, 1],[1, 1, 1, 1, -1],[-1, -1, -1, -1, -1]
]
输出:
[1, -1, -1, -1, -1]
解释:
- 球 0 从第 0 列开始下落,最终落在第 1 列。
- 球 1 从第 1 列开始下落,卡在第 1 列和第 2 列之间。
- 球 2 从第 2 列开始下落,卡在第 2 列和第 3 列之间。
- 球 3 从第 3 列开始下落,卡在第 3 列和第 4 列之间。
- 球 4 从第 4 列开始下落,卡在第 4 列。
思路分析
问题核心
我们需要模拟每个球在网格中的下落过程,并确定它们最终会落在哪个列。网格中的每个单元格的值可以是 1 或 -1:
1表示单元格的右上方和左下方有对角线,球会向右移动。-1表示单元格的左上方和右下方有对角线,球会向左移动。
球的下落过程需要遵循以下规则:
- 如果球碰到
1,它会向右移动。 - 如果球碰到
-1,它会向左移动。 - 如果球移动时碰到边界或者移动方向与相邻单元格的对角线方向不一致,球会卡住。
思路拆解后的重点: 模拟每个球的下落和移动方向的计算
代码段
class Solution {public int[] findBall(int[][] grid) {int len = grid[0].length;int[] ans = new int[len];for (int i = 0; i < len; i++) {int k = i;for (int[] row : grid) {int d = row[k];k += d;if (k < 0 || k == len || row[k] != d) {k = -1;break;}}ans[i] = k;}return ans;}
}

代码逐行讲解
下面有整合
1. 获取网格的列数
int len = grid[0].length;
grid是一个二维数组,表示网格。grid[0].length获取网格的列数len。
2. 初始化结果数组
int[] ans = new int[len];
ans是一个大小为len的数组,用于存储每个球的最终位置。
3. 遍历每个球
for (int i = 0; i < len; i++) {int k = i; // 当前球的起始列
- 使用
for循环遍历每个球,i表示球的起始列。 k是当前球的列位置,初始化为起始列i。
4. 逐行模拟下落过程
for (int[] row : grid) {int d = row[k]; // 当前单元格的值(1 或 -1)k += d; // 计算下一列
- 使用增强的
for循环遍历每一行row。 d是当前单元格的值,可以是1或-1。k += d计算球的下一列位置:- 如果
d = 1,球向右移动,k增加 1。 - 如果
d = -1,球向左移动,k减少 1。
- 如果
5. 检查是否卡住
if (k < 0 || k == len || row[k] != d) {k = -1; // 球卡住break;
}
- 边界检查:
- 如果
k < 0,球移动到左边界外。 - 如果
k == len,球移动到右边界外。
- 如果
- 方向一致性检查:
- 如果
row[k] != d,球的移动方向与相邻单元格的对角线方向不一致。
- 如果
- 如果球卡住,将
k设置为-1,并跳出循环。
6. 记录结果
ans[i] = k; // 记录结果
- 将每个球的最终位置
k记录到结果数组ans中。
7. 返回结果数组
return ans; // 返回结果数组
- 返回结果数组
ans,其中每个元素表示对应球的最终位置。
复杂度分析
时间复杂度
- 对于每个球,我们需要逐行模拟下落过程,最多需要遍历
m行。 - 总共有
n个球,因此总时间复杂度为 O(m * n)。
空间复杂度
- 我们只需要一个大小为
n的数组来存储结果,因此空间复杂度为 O(n)。
总结的知识点
1. 二维数组的遍历
- 使用增强的
for循环遍历二维数组grid。 - 外层循环遍历列,内层循环遍历行。
2. 边界检查
- 使用条件判断检查球是否移动到网格的边界外。
3. 条件判断
- 使用
if语句判断球是否卡住。
4. 模拟过程
- 通过逐行模拟球的下落过程,实时更新球的位置。
5. 结果记录
- 使用数组
ans记录每个球的最终位置。
整合
class Solution {public int[] findBall(int[][] grid) {int len = grid[0].length; // 获取网格的列数int[] ans = new int[len]; // 初始化结果数组// 遍历每个球for (int i = 0; i < len; i++) {int k = i; // 当前球的起始列// 逐行模拟下落过程for (int[] row : grid) {int d = row[k]; // 当前单元格的值(1 或 -1)k += d; // 计算下一列// 检查是否卡住if (k < 0 || k == len || row[k] != d) {k = -1; // 球卡住break;}}ans[i] = k; // 记录结果}return ans; // 返回结果数组}
}
总结
我认为整体上还是简洁高效,逐行模拟球的下落过程,并实时检查是否卡住,来进行判断并解决问题。
相关文章:
LeetCode1706
LeetCode1706 目录 LeetCode1706题目描述示例题目理解问题描述 示例分析思路分析问题核心 代码段代码逐行讲解1. 获取网格的列数2. 初始化结果数组3. 遍历每个球4. 逐行模拟下落过程5. 检查是否卡住6. 记录结果7. 返回结果数组 复杂度分析时间复杂度空间复杂度 总结的知识点1. …...
2517. 礼盒的最大甜蜜度(Maximum Tastiness of Candy Box)
2517. 礼盒的最大甜蜜度(Maximum Tastiness of Candy Box) 问题描述 给定一个正整数数组 price,其中 price[i] 表示第 i 类糖果的价格,另给定一个正整数 k。商店将 k 类不同糖果组合成礼盒出售。礼盒的甜蜜度是礼盒中任意两种糖…...
Golang 的字符编码与 regexp
前言 最近在使用 Golang 的 regexp 对网络流量做正则匹配时,发现有些情况无法正确进行匹配,找到资料发现 regexp 内部以 UTF-8 编码的方式来处理正则表达式,而网络流量是字节序列,由其中的非 UTF-8 字符造成的问题。 我们这里从 G…...
利用ollama 与deepseek r1大模型搭建本地知识库
1.安装运行ollama ollama下载 https://ollama.com/download/windows 验证ollama是否安装成功 ollama --version 访问ollama本地地址: http://localhost:11434/ 出现如下界面 ollama运行模型 ollama run llama3.2 ollama常用操作命令 启动 Ollama 服务…...
Java短信验证功能简单使用
注册登录阿里云官网:https://www.aliyun.com/ 搜索短信服务 自己一步步申请就可以了 开发文档: https://next.api.aliyun.com/api-tools/sdk/Dysmsapi?version2017-05-25&languagejava-tea&tabprimer-doc 1.引入依赖 <dependency>…...
CAS单点登录(第7版)21.可接受的使用政策
如有疑问,请看视频:CAS单点登录(第7版) 可接受的使用政策 概述 可接受的使用政策 CAS 也称为使用条款或 EULA,它允许用户在继续应用程序之前接受使用策略。此功能的生产级部署需要修改流,以便通过外部存…...
53倍性能提升!TiDB 全局索引如何优化分区表查询?
作者: Defined2014 原文来源: https://tidb.net/blog/7077577f 什么是 TiDB 全局索引 在 TiDB 中,全局索引是一种定义在分区表上的索引类型,它允许索引分区与表分区之间建立一对多的映射关系,即一个索引分区可以对…...
Pythong 解决Pycharm 运行太慢
Pythong 解决Pycharm 运行太慢 官方给Pycharm自身占用的最大内存设低估了限制,我的Pycharm刚开始默认是256mb。 首先找到自己的Pycharm安装目录 根据合适自己的改 保存,重启Pycharm...
库里存储的数据有大量回车时,该如何进行存取
如图,打印模板存了很多坐标性的字段数据: 大量带换行的文本数据存到库里之后取出,前端需要做非空、合法校验, 然后在循环中,使用eval 函数接收每一句字符串,去执行这句 JavaScript 代码。 let arrStr tem…...
【devops】Github Actions Secrets | 如何在Github中设置CI的Secret供CI的yaml使用
一、Github Actions 1、ci.yml name: CIon: [ push ]jobs:build:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkoutv3- name: Set up Gouses: actions/setup-gov4with:go-version: 1.23.0- name: Cache Go modulesuses: actions/cachev3with:path: |…...
体验 DeepSeek-R1:解密 1.5B、7B、8B 版本的强大性能与应用
文章目录 🍋引言🍋DeepSeek 模型简介🍋版本更新:1.5B、7B、8B 的区别与特点🍋模型评估🍋体验 DeepSeek 的过程🍋总结 🍋引言 随着大规模语言模型的持续发展,许多模型在性…...
一文说清楚什么是Token以及项目中使用Token延伸的问题
首先可以参考我的往期文章,我这里说清楚了Cookie,Seesion,Token以及JWT是什么 其实Token你就可以理解成这是一个认证令牌就好了 详细分清Session,Cookie和Token之间的区别,以及JWT是什么东西_还分不清 cookie、sessi…...
大模型-Tool call、检索增强
大模型 Tool call 心知天气:https://www.seniverse.com/ 例子:调用天气接口 API from openai import OpenAI import requests import json """ ##### 天气接口 API 密钥获取:https://www.free-api.com/doc/558 ##### &quo…...
【算法】【区间和】acwing算法基础 802. 区间和 【有点复杂,但思路简单】
题目 假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。 现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。 接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] …...
Ubuntu22.04通过Docker部署Jeecgboot
程序发布环境包括docker、mysql、redis、maven、nodejs、npm等。 一、安装docker 1、用如下命令卸载旧Docker: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done 2、安装APT环境依赖包…...
HTML4
HTML 初体验 1.鼠标右键 > 新建 > 文本文档 > 输入以下内容,并保存 2.修改后缀为 .html ,然后双击打开即可 这里的后缀名,使用 .htm 也可以,但推荐使用更标准的 .html <marquee>尚硅谷,让天下没有难…...
STM32F10X 启动文件完整分析
最近在准备面试相关 顺便复盘总结一下之前的内容 启动文件在基于ARM的芯片是很重要的组成部分,它主要负责完成芯片上电启动时的一系列初始化工作和各种异常及中断的入口地址。 也是理解bootloader自举的关键点,所以需要理解一下 1. 向量表定义 启动文件…...
typescript快速入门之安装与运行
安装 安装ts环境,最好全局安装,这样就不需要开一个项目又安装 npm i -g typescript初始化 可以运行初始化配置文件,也可以手动生成;不生成的话会运行默认配置 使用默认配置 把ts文件转成js文件使用的是es3语言,语…...
React源码解读
配置React源码本地调试环境 本次环境构建采用了node版本为16、react-scripts 版本号为 3.4.4,源码下载地址 react源码调试: react源码调试环境 使用 create-react-app 脚手架创建项目 npx create-react-app react-test 进入刚刚下载的目录,弹射 crea…...
【DeepSeek-R1】 API申请(火山方舟联网版)
DeepSeek-R1 API申请(火山方舟联网版) 1、新建联网版应用2、开通信息增强服务3、开启联网内容插件4、创建接入点5、获取模型名称6、获取API Key 如果第一次注册账号,请先按照文章《【Deepseek-R1】 API申请(火山方舟)》…...
光学MEMS麦克风:突破电容式瓶颈,实现80dB SNR与146dB AOP的音频革命
1. 从电容到光学:为什么MEMS麦克风需要一场革命?如果你拆开过最近五年的任何一部主流智能手机,里面的麦克风十有八九是电容式MEMS(微机电系统)麦克风。这种小东西几乎定义了现代消费电子音频采集的标准:体积…...
基于大语言模型与提示词工程构建交互式人生模拟游戏
1. 项目概述:当AI成为你的“人生导演”如果你玩过《模拟人生》或者看过《楚门的世界》,大概能理解那种被设定好的、却又充满无限可能的人生体验。现在,把这个“导演”换成GPT-4,一个能理解你、能即兴创作、还能根据你的选择实时生…...
5分钟极速上手!NsEmuTools:NS模拟器一站式管理神器
5分钟极速上手!NsEmuTools:NS模拟器一站式管理神器 【免费下载链接】ns-emu-tools 一个用于安装/更新 NS 模拟器的工具 项目地址: https://gitcode.com/gh_mirrors/ns/ns-emu-tools 还在为NS模拟器的繁琐配置而烦恼吗?NsEmuTools就是为…...
Beyond Compare 5密钥生成完全指南:3种方法快速解决评估错误
Beyond Compare 5密钥生成完全指南:3种方法快速解决评估错误 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 如果您正在使用Beyond Compare 5进行文件对比工作,30天评估期…...
Openaibot:模块化LLM聊天机器人框架的设计、部署与优化实践
1. 项目概述:一个能帮你“驯服”AI的聊天机器人框架如果你正在寻找一个能让你轻松集成和深度定制大型语言模型(LLM)能力的聊天机器人框架,那么LlmKira/Openaibot这个项目绝对值得你花时间研究。它不是一个简单的“套壳”应用&…...
linux学习进展 mysql数据库
前面我们已经掌握了Linux网络编程的核心:TCP/UDP协议、Socket编程、线程池(半同步半异步模型),也实现了极简HTTP服务器。但实际的网络程序中,我们需要持久化存储数据——比如用户信息、接口请求记录、业务数据等&#…...
【计算机网络】第22篇:传输层安全——TLS握手协议的状态机与密钥派生
目录 1. TLS在协议栈中的位置 2. TLS 1.3握手的两种模式 2.1 (EC)DHE握手:一个往返的密钥交换 2.2 PSK握手:零往返的会话恢复 3. HKDF密钥派生链 3.1 从共享秘密到会话密钥 3.2 密钥分离与方向隔离 4. 前向安全性与0-RTT的张力 4.1 前向安全性的…...
Selenium菜鸟教程学习笔记
Selenium菜鸟教程学习笔记 本博客仅为个人学习记录与理解分享,非商业用途,所有代码与文档版权归原项目及其贡献者所有。selenium菜鸟教程 一、Selenium环境搭建 1.安装Selenium库 使用Python编写自动化脚本来控制浏览器 pip install selenium2.测试…...
如何用30美元DIY你的AI智能眼镜:OpenGlass开源项目完整指南
如何用30美元DIY你的AI智能眼镜:OpenGlass开源项目完整指南 【免费下载链接】OpenGlass Turn any glasses into AI-powered smart glasses 项目地址: https://gitcode.com/GitHub_Trending/op/OpenGlass 还在为动辄数千元的智能眼镜价格望而却步吗࿱…...
从零构建企业级设计系统:原子设计、React与Stitches实战
1. 项目概述:一个设计系统的诞生与价值最近在整理团队过去一年的项目文档,发现一个有趣的现象:无论是新来的实习生,还是合作多年的产品经理,在讨论界面细节时,总会出现一些“鸡同鸭讲”的尴尬时刻。比如&am…...
