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

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

坐井说天阔---DeepSeek-R1

前言 DeepSeek-R1这么火&#xff0c;虽然网上很多介绍和解读&#xff0c;但听人家的总不如自己去看看原论文。于是花了大概一周的时间&#xff0c;下班后有进入了研究生的状态---读论文。 DeepSeek这次的目标是探索在没有任何监督数据的情况下训练具有推理能力的大模型&#…

moveable 一个可实现前端海报编辑器的 js 库

目录 缘由-胡扯本文实验环境通用流程1.基础移动1.1 基础代码1.1.1 data-* 解释 1.2 操作元素创建1.3 css 修饰1.4 cdn 引入1.5 js 实现元素可移动1.6 图片拖拽2.缩放3.旋转4.裁剪 懒得改文案了&#xff0c;海报编辑器换方案了&#xff0c;如果后面用别的再更。 缘由-胡扯 导火…

滑动窗口算法篇:连续子区间与子串问题

1.滑动窗口原理 那么一谈到子区间的问题&#xff0c;我们可能会想到我们可以用我们的前缀和来应用子区间问题&#xff0c;但是这里对于子区间乃至子串问题&#xff0c;我们也可以尝试往滑动窗口的思路方向去进行一个尝试&#xff0c;那么说那么半天&#xff0c;滑动窗口是什么…

resultType,jdbcType,parameterType区别

1. resultType 用途&#xff1a; 用于定义 SQL 查询结果的返回类型。 直接将查询结果映射到指定的 Java 类型&#xff08;基本类型、POJO 或 Map&#xff09;。 特点&#xff1a; 要求数据库字段名与 Java 对象的属性名完全一致&#xff08;或通过别名匹配&#xff09;。 …

数字化转型导师坚鹏:AI大模型DEEPSEEK使用方法及案例

AI大模型DEEPSEEK使用方法及案例 ——提升职场人士工作效率 打造数字化转型新利器 课程背景&#xff1a; 很多企业和员工存在以下问题&#xff1a; 不知道DEEPSEEK的发展现状及价值&#xff1f;不知道DEEPSEEK提示词设计方法论&#xff1f;不知道DEEPSEEK的针对性使用案例&…

Spring Boot项目接收前端参数的11种方式

大家好&#xff0c;我是。在前后端项目交互中&#xff0c;前端传递的数据可以通过HTTP请求发送到后端&#xff0c; 后端在Spring Boot中如何接收各种复杂的前端数据呢&#xff1f;这篇文章总结了11种在Spring Boot中接收前端数据的方式。 1 搭建项目 1.通过Spring Initializr…

Deesek:新一代数据处理与分析框架实战指南

Deesek&#xff1a;新一代数据处理与分析框架实战指南 引言 在大数据时代&#xff0c;高效处理和分析海量数据是企业和开发者面临的核心挑战。传统工具如Pandas、Spark等虽功能强大&#xff0c;但在实时性、易用性或性能上仍有提升空间。Deesek&#xff08;假设名称&#xff…

算法笔记 02 —— 入门模拟

本系列为胡凡编著的算法笔记当中代码部分的精简版整理&#xff0c;笔者也在同时准备Leetcode刷题和实习面试&#xff0c;希望为有一定编码和数据结构基础的同学提供一份系统型的参考&#xff0c;以方便遗忘时的算法查阅、期末复习总览以及C学习参照。 目录 01 简单模拟 Ⅰ害…

Node.js技术原理分析系列——Node.js调试能力分析

本文由体验技术团队屈金雄原创。 Node.js 是一个开源的、跨平台的 JavaScript 运行时环境&#xff0c;它允许开发者在服务器端运行 JavaScript 代码。Node.js 是基于 Chrome V8引擎构建的&#xff0c;专为高性能、高并发的网络应用而设计&#xff0c;广泛应用于构建服务器端应…

LLaMA-Factory DeepSeek-R1 模型 微调基础教程

LLaMA-Factory 模型 微调基础教程 LLaMA-FactoryLLaMA-Factory 下载 AnacondaAnaconda 环境创建软硬件依赖 详情LLaMA-Factory 依赖安装CUDA 安装量化 BitsAndBytes 安装可视化微调启动 数据集准备所需工具下载使用教程所需数据合并数据集预处理 DeepSeek-R1 可视化微调数据集处…

Spring Boot实战:拦截器

一.拦截器快速入门 1.1了解拦截器 什么是拦截器&#xff1a; 概念 &#xff1a;拦截器是Spring框架提供的核功能之, 主要来拦截的请求, 在指定法前后, 根据业务需要执预先设定的代码。 也就是说, 允许开发员提前预定义些逻辑, 在的请求响应前后执. 也可以在请求前阻其执. …

LabVIEW 用户界面设计基础原则

在设计LabVIEW VI的用户界面时&#xff0c;前面板的外观和布局至关重要。良好的设计不仅提升用户体验&#xff0c;还能提升界面的易用性和可操作性。以下是设计用户界面时的一些关键要点&#xff1a; 1. 前面板设计原则 交互性&#xff1a;组合相关的输入控件和显示控件&#x…

qt-C++笔记之QGraphicsScene和 QGraphicsView中setScene、通过scene得到view、通过view得scene

qt-C++笔记之QGraphicsScene和 QGraphicsView中setScene、通过scene得到view、通过view得scene code review! 文章目录 qt-C++笔记之QGraphicsScene和 QGraphicsView中setScene、通过scene得到view、通过view得scene1.`setScene` 方法2.通过 `scene` 获取它的视图 (`views()`)…

CI/CD部署打包方法

项目目前部署方式&#xff1a; 各地区服务器打包同一个runner&#xff08;需要互相排队&#xff0c;不并发&#xff09;各地区客户端可以并发打包&#xff0c;同个地区客户端打多个包需要排队 部署方法 下载gitlab-runner&#xff1a; https://docs.gitlab.com/runner/insta…

【含文档+源码】基于Web的在线课堂测试课程考评系统的开发与实现

项目介绍 本课程演示的是一款 基于Web的在线课堂测试课程考评系统的开发与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…

【vscode】VScode Remote SSH配置

VScode使用remote ssh 到服务器上的Docker容器中 1. 配置远程服务器docker容器的端口映射&#xff0c;例如将服务器的2222端口映射到container的22端口(默认) 1.1 在容器系统的sshd_config文件中配置参数 #配置文件 vim /etc/ssh/sshd_config #打开端口号 Port 221.2 建立容…

2月第九讲“探秘Transformer系列”

0.1 流程 使用Transformer来进行文本生成其实就是用模型来预测下一个词&#xff0c;完整流程包括多个阶段&#xff0c;如分词、向量化、计算注意力和采样&#xff0c;具体运作流程如下&#xff1a; 分词&#xff08;tokenize&#xff09;。把用户的输入文本&#xff08;此处假…

crewai框架(0.83.0)添加知识源

官方的文档如下 https://docs.crewai.com/concepts/knowledge但是不知道为什么&#xff0c;可能是版本的问题&#xff08;我用的是0.86.0&#xff09;&#xff0c;参考官方文档的配置我会报错&#xff0c;并且也导入不了数据库&#xff0c;也可能用的不是官方API。本文以常用的…

deepseek + embeding模型搭建本地知识库

上一篇文章讲了ollamadeepseek模型的本地化部署&#xff0c;具体能部署哪一款取决于你的土豪程度&#xff1a; 今天的目标是本地安装部署embeding模型&#xff0c;实现LLMembeding模型的rag知识库的本地化部署&#xff0c;包括&#xff1a; embeding模型的本地化部署anyhingL…

2、树莓派5第一次开机三种方式:使用外设 / 使用网线 / 使用wifi

本文整理了树莓派第一次开机方式&#xff0c;供大家参考 方式一&#xff1a;连接鼠标、键盘、显示器外设开机 树莓派自带USB接口及HDMI接口&#xff0c;因此可以通过USB连接鼠标键盘&#xff0c;HDMI接入显示器&#xff0c;再进行电源供电&#xff0c;就可以完成第一次开机 …