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,它会向右移动。
  2. 如果球碰到 -1,它会向左移动。
  3. 如果球移动时碰到边界或者移动方向与相邻单元格的对角线方向不一致,球会卡住。

我们需要返回一个大小为 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,它会向右移动。
  2. 如果球碰到 -1,它会向左移动。
  3. 如果球移动时碰到边界或者移动方向与相邻单元格的对角线方向不一致,球会卡住。

思路拆解后的重点: 模拟每个球的下落和移动方向的计算


代码段

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; // 返回结果数组}
}

总结

我认为整体上还是简洁高效,逐行模拟球的下落过程,并实时检查是否卡住,来进行判断并解决问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/70001.shtml

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

相关文章

前后端的身份认证

现代Web应用程序中&#xff0c;身份认证是确保用户数据安全的关键环节。无论你是开发一个简单的博客系统还是复杂的企业级应用&#xff0c;正确实现身份验证机制都是至关重要的。本文将探讨如何在前后端分离的架构下&#xff0c;使用Node.js作为后端来实现安全有效的身份认证。…

如何调整 Nginx工作进程数以提升性能

&#x1f3e1;作者主页&#xff1a;点击&#xff01; Nginx-从零开始的服务器之旅专栏&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年2月15日14点20分 Nginx 的工作进程数&#xff0…

学习web数据埋点

什么是埋点&#xff0c;以及为什么需要埋点 通过代码主动收集用户行为数据&#xff08;如点击、浏览、停留时长等&#xff09;&#xff0c;用于数据分析驱动产品优化。 一、前端埋点 在客户端&#xff08;浏览器、移动端应用&#xff09;直接采集用户行为数据&#xff0c;通…

VMware Workstation Pro 下载(无需注册账号)

VMware Workstation Pro 目前对个人用户完全免费。有两种下载方式&#xff0c;分别为 1、Broadcom 官网下载 需要注册账号&#xff0c;我懒得注册 2、VMware 更新服务器下载 如果不想注册账号&#xff0c;可以通过 VMware 更新服务器直接下载。访问以下链接&#xff1a; ht…

04性能监控与调优篇(D1_学习前言)

目录 一、引言 二、基本介绍 三、JVM基础 1. java堆 2. 垃圾回收 3. STW 四、调优层次 五、调优指标 六、JVM调优原则 1. 优先原则 2. 堆设置 3. 垃圾回收器设置 1> GC 发展阶段 2> G1的适用场景 3> 其他收集器适⽤场景 4. 年轻代设置 5. 年⽼代设置 …

【php】Static 关键字注意事项

静态属性不可以由对象通过 -> 操作符来访问。 代码 <?phpclass parent1{static $a "1 ";static function fun(){echo "dddd ";}}echo parent1::$a;parent1::fun();echo "----------------------<br>";$c new parent1();//错误&a…

环境影响评价(EIA)中,土地利用、植被类型及生态系统图件的制作

在环境影响评价&#xff08;EIA&#xff09;中&#xff0c;土地利用、植被类型及生态系统图件的制作需依据科学、法规和技术规范&#xff0c;以确保数据的准确性和图件的规范性。以下是主要的制作依据&#xff1a; 1. 法律法规与政策依据 《中华人民共和国环境影响评价法》 明确…

使用LightGBM与Apache Spark进行多分类任务

在大数据环境中&#xff0c;使用机器学习算法处理复杂的分类问题是常见的需求。本文将介绍如何利用Apache Spark和Microsoft Synapse ML库中的LightGBM模型来执行多分类任务。我们将通过一个具体的示例&#xff0c;展示从数据准备到模型训练和评估的完整流程。 环境设置 首先…

2025年SEO工具有哪些?老品牌SEO工具有哪些

随着2025年互联网的发展和企业线上营销的日益重要&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;逐渐成为了提高网站曝光率和流量的重要手段。SEO的工作不仅仅是简单地通过关键词优化和内容发布就能够实现的&#xff0c;它需要依赖一系列专业的SEO工具来帮助分析、监测和…

关于视频去水印的一点尝试

一. 视频去水印的几种方法 1. 使用ffmpeg delogo滤镜 delogo 滤镜的原理是通过插值算法&#xff0c;用水印周围的像素填充水印的位置。 示例&#xff1a; ffmpeg -i input.mp4 -filter_complex "[0:v]delogox420:y920:w1070:h60" output.mp4 该命令表示通过滤镜…

调用DeepSeek API接口:实现智能数据挖掘与分析

在当今数据驱动的时代&#xff0c;企业和开发者越来越依赖高效的数据挖掘与分析工具来获取有价值的洞察。DeepSeek作为一款先进的智能数据挖掘平台&#xff0c;提供了强大的API接口&#xff0c;帮助用户轻松集成其功能到自己的应用中。本文将详细介绍如何调用DeepSeek API接口&…

AWS助力AI智能扫地机器人马来西亚项目技术解析与成本优化实践

一、背景与挑战 随着东南亚市场对智能家居产品需求的快速增长&#xff0c;某科技公司计划在马来西亚投放新一代AI智能扫地机器人。该产品需满足以下核心需求&#xff1a; 实时处理多传感器数据&#xff08;激光雷达、摄像头、陀螺仪&#xff09; 支持百万级设备并发连接与OTA…

【实测】用全志A733平板搭建一个端侧Deepseek算力平台

随着DeepSeek 的蒸馏技术的横空出世&#xff0c;端侧 SoC 芯片上运行大模型成为可能。那么端侧芯片跑大模型的效果如何呢&#xff1f;本文将在全志 A733 芯片平台上部署一个 DeepSeek-R1:1.5B 模型&#xff0c;并进行实测效果展示。 端侧平台环境 设备&#xff1a;全志A733平板…

浅聊MQ之Kafka与RabbitMQ简用

&#xff08;前记&#xff1a;内容有点多&#xff0c;先看目录再挑着看。&#xff09; Kafka与RabbitMQ的使用举例 Kafka的使用举例 安装与启动&#xff1a; 从Apache Kafka官网下载Kafka中间件的运行脚本。解压后&#xff0c;通过命令行启动Zookeeper&#xff08;Kafka的运行…

两步在 Vite 中配置 Tailwindcss

第一步&#xff1a;安装依赖 npm i -D tailwindcss tailwindcss/vite第二步&#xff1a;引入 tailwindcss 更改配置 // src/main.js import tailwindcss/index// vite.config.js import vue from vitejs/plugin-vue import tailwindcss from tailwindcss/viteexport default …

执行js生成json文件并动态写入数据

项目中需要执行js后生成一个新的json文件&#xff0c;并在该文件内写入json数据&#xff0c; 示例&#xff1a;生成一个json文件&#xff0c;内含执行这个js的时间戳作为json文件中的数据。 新建一个js文件create.js&#xff0c;js代码如下&#xff1a; const fs require(fs)…

报名丨Computer useVoice Agent :使用 TEN 搭建你的 Mac Assistant

与 TEN 相聚在「LET’S VISION 2025」大会&#xff0c;欢迎来展位上跟我们交流。这次我们还准备了一场聚焦「computer use」的工作坊&#xff0c;功能新鲜上线&#xff0c;线下首波体验&#xff01; &#x1f4c5; TEN 展位&#xff1a;2025年3月1日-2日 TEN workshop&#x…

深入剖析 Apache Shiro550 反序列化漏洞及复现

目录 前言 一、认识 Apache Shiro 二、反序列化漏洞&#xff1a;隐藏在数据转换中的风险 三、Shiro550 漏洞&#xff1a;会话管理中的致命缺陷 四、漏洞危害&#xff1a;如多米诺骨牌般的连锁反应 五、漏洞复现&#xff1a;揭开攻击的神秘面纱 &#xff08;一&#xff0…

【油猴脚本/Tampermonkey】DeepSeek 服务器繁忙无限重试(20250214优化)

目录 一、 引言 二、 逻辑 三、 源代码 四、 添加新脚本 五、 使用 六、 BUG 七、 优化日志 1.获取最后消息内容报错 2.对话框切换无法正常使用 一、 引言 deepseek演都不演了&#xff0c;每次第一次提问就正常&#xff0c;后面就开始繁忙了&#xff0c;有一点阴招全…

uniapp - iconfont下载本地并且运用至项目上

1、项目中创建一个文件夹放置iconfont相关文件&#xff0c;例如src/assets/iconfont&#xff08;名称自己定义&#xff09; 2、在iconfont下载项目至本地 3、解压后把文件复制进1的文件夹中 4、修改src/assets/iconfont - iconfont.css里的font-face的src地址&#xff0c;修…