LeetCode 1289. 下降路径最小和 II:通俗易懂地讲解O(n^2) + O(1)的做法

【LetMeFly】1289.下降路径最小和 II:通俗易懂地讲解O(n^2) + O(1)的做法

力扣题目链接:https://leetcode.cn/problems/minimum-falling-path-sum-ii/

给你一个 n x n 整数矩阵 arr ,请你返回 非零偏移下降路径 数字和的最小值。

非零偏移下降路径 定义为:从 arr 数组中的每一行选择一个数字,且按顺序选出来的数字中,相邻数字不在原数组的同一列。

 

示例 1:

输入:arr = [[1,2,3],[4,5,6],[7,8,9]]
输出:13
解释:
所有非零偏移下降路径包括:
[1,5,9], [1,5,7], [1,6,7], [1,6,8],
[2,4,8], [2,4,9], [2,6,7], [2,6,8],
[3,4,8], [3,4,9], [3,5,7], [3,5,9]
下降路径中数字和最小的是 [1,5,7] ,所以答案是 13 。

示例 2:

输入:grid = [[7]]
输出:7

 

提示:

  • n == grid.length == grid[i].length
  • 1 <= n <= 200
  • -99 <= grid[i][j] <= 99

方法一:动态规划

这道题其实思路很简单:

  1. gird[i][j]来自gird[i - 1]的哪一个?当然是gird[i - 1]中最小的那一个。
  2. 如果grid[i - 1]中最小的那个元素恰好是j怎么办?那么gird[i][j]就来自gird[i - 1]中第二小的那一个。

不难发现,我们只关注上一行最小的两个元素(的位置)

具体实现

写一个函数findMin2(v),用来寻找数组v中最小的两个元素的位置。

i i i从第2行开始遍历地图grid:

  • j j j遍历 g i r d [ i ] gird[i] gird[i]
    • 如果 j j j等于上一行最小元素的下标: g r i d [ i ] [ j ] + = g r i d [ i − 1 ] [ 第二小元素的下标 ] grid[i][j] += grid[i - 1][第二小元素的下标] grid[i][j]+=grid[i1][第二小元素的下标]
    • 否则 g r i d [ i ] [ j ] + = g r i d [ i − 1 ] [ 最小元素的下标 ] grid[i][j] += grid[i - 1][最小元素的下标] grid[i][j]+=grid[i1][最小元素的下标]

最终返回最后一行的最小元素即可。

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2),其中 s i z e ( g i r d ) = n × n size(gird) = n\times n size(gird)=n×n
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++

class Solution {
private:pair<int, int> findMin2(vector<int>& v) {  // 只接收长度大于等于2的vpair<int, int> ans;int m = v[0], loc = 0;for (int i = 0; i < v.size(); i++) {if (v[i] < m) {m = v[i], loc = i;}}ans.first = loc;loc = ans.first ? 0 : 1, m = v[loc];  // 如果第一个元素是最小的,那么找第二个最小元素的时候就从上一行的第二个元素开始for (int i = 0; i < v.size(); i++) {if (v[i] < m && i != ans.first) {m = v[i], loc = i;}}ans.second = loc;return ans;}
public:int minFallingPathSum(vector<vector<int>>& grid) {int n = grid.size();for (int i = 1; i < n; i++) {pair<int, int> last2min = findMin2(grid[i - 1]);  // i >= 1说明grid[i - 1].size() >= 2for (int j = 0; j < n; j++) {grid[i][j] += (j == last2min.first ? grid[i - 1][last2min.second] : grid[i - 1][last2min.first]);}}return *min_element(grid.back().begin(), grid.back().end());}
};

Python

# from typing import Listclass Solution:def findMin2(self, v: List[int]) -> List[int]:ans = [0, 0]m, loc = v[0], 0for i in range(len(v)):if v[i] < m:m, loc = v[i], ians[0] = locloc = 0 if ans[0] else 1m = v[loc]for i in range(len(v)):if v[i] < m and i != ans[0]:m, loc = v[i], ians[1] = locreturn ansdef minFallingPathSum(self, grid: List[List[int]]) -> int:n = len(grid)for i in range(1, n):last2min = self.findMin2(grid[i - 1])for j in range(n):grid[i][j] += grid[i - 1][last2min[0]] if j != last2min[0] else grid[i - 1][last2min[1]]return min(grid[-1])

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/132201281

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

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

相关文章

函数(1)

1. 函数是什么&#xff1f; 数学中我们常见到函数的概念。但是你了解C语言中的函数吗&#xff1f; 维基百科中对函数的定义&#xff1a;子程序 在计算机科学中&#xff0c;子程序&#xff08;英语&#xff1a;Subroutine, procedure, function, routine, method, subprogram, …

“先锋龙颜美学”,比亚迪宋L 完成工信部申报,单双电机正式上市

根据工信部最新发布的《道路机动车辆生产企业及产品公告》&#xff08;第 374 批&#xff09;&#xff0c;我们得知比亚迪汽车公司的新款车型宋 L 已经顺利完成申报&#xff0c;并成功获得核准。这款车型将会有两个版本&#xff0c;分别是单电机和双电机版本。 此外&#xff0c…

Android T 窗口层级其二 —— 层级结构树的构建(更新中)

如何通过dump中的内容找到对应的代码&#xff1f; 我们dump窗口层级发现会有很多信息&#xff0c;adb shell dumpsys activity containers 这里我们以其中的DefaultTaskDisplayArea为例 在源码的framework目录下查找该字符串&#xff0c;找到对应的代码就可以通过打印堆栈或者…

VSCODE[配置ssh免密远程登录]

配置ssh免密远程登录 本文摘录于&#xff1a;https://blog.csdn.net/qq_44571245/article/details/123031276只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 这里要注意如下几个地方: 1.要进入.ssh目录创建文件: 2.是拷贝带"ssh-…

【LeetCode】55. 跳跃游戏 - 贪婪算法

目录标题 2023-8-10 16:27:05 55. 跳跃游戏 2023-8-10 16:27:05 class Solution {public boolean canJump(int[] nums) {int n nums.length;int arrivalLocation 0;for (int i 0; i < n; i) {if (i < arrivalLocation) {arrivalLocation Math.max(arrivalLocation,…

手把手教你如何零成本搭建网站实现内网穿透从而创建自己的数据隧道

手把手教你如何零成本搭建网站实现内网穿透从而创建自己的数据隧道 文章目录 手把手教你如何零成本搭建网站实现内网穿透从而创建自己的数据隧道前言1. 安装网站运行和发布必备软件2. 安装PHPStudy3. 安装wordpress4. 进入wordpress安装程序&#xff0c;进行网页编辑和设置5. 安…

Windows Oracle21C与PLSQL Developer 15配置

1、下载Oracle21c并安装 下载地址&#xff1a;https://www.oracle.com/database/technologies/oracle21c-windows-downloads.html 2、下载PLSQL Developer 15并安装 下载地址&#xff1a;https://www.allroundautomations.com/products/pl-sql-developer/#pricing 3、配置O…

Claude 2、ChatGPT、Google Bard优劣势比较

​Claude 2&#xff1a; 优势&#xff1a;Claude 2能够一次性处理多达10万个tokens&#xff08;约7.5万个单词&#xff09;。 tokens数量反映了模型可以处理的文本长度和上下文数量。tokens越多&#xff0c;模型理解语义的能力就越强&#xff09;。它在法律、数学和编码等多个…

K8S MetalLB LoadBalancer

1. 简介 kubernetes集群没有L4负载均衡&#xff0c;对外暴漏服务时&#xff0c;只能使用nodePort的方式&#xff0c;比较麻烦&#xff0c;必须要记住不同的端口号。 LoadBalancer&#xff1a;使用云提供商的负载均衡器向外部暴露服务&#xff0c;外部负载均衡器可以将流量路由…

Leaflet入门,Leaflet如何自定义版权信息,以vue2-leaflet修改自定义版权为例

前言 本章讲解使用Leaflet的vue2-leaflet或者vue-leaflet插件来实现自定义版权信息的功能。 # 实现效果演示 见图片右下角版权信息 vue如何使用Leaflet vue2如何使用:《Leaflet入门,如何使用vue2-leaflet实现vue2双向绑定式的使用Leaflet地图,以及初始化后拿到leaflet对象…

Java获取指定文件夹下目录下所有视频并复制到另一个地方

import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.StandardCopyOption;public class VideoCopier {public static void main(String[] args) {// 指定源文件夹路径和目标文件夹路径String sourceFolderPath "path/to…

OSI参考模型及TCP/IP协议栈

一、网络概述 1.1、什么是网络&#xff1f; 1、网络的本质就是实现资源共享 2、将各个系统联系到一起&#xff0c;形成信息传递、接收、共享的信息交互平台 1.2、典型的园区网拓扑 1.3、网络历史发展&#xff0c;ARPA和ARPANET 1、1969年&#xff0c;美国国防部高级研究计…

8.10论文阅读

文章目录 The multimodal MRI brain tumor segmentation based on AD-Net摘要本文方法损失函数 实验结果 max-vit - unet:多轴注意力医学图像分割摘要本文方法实验结果 The multimodal MRI brain tumor segmentation based on AD-Net 摘要 基于磁共振成像(MRI)的多模态胶质瘤…

JavaEE——网络编程(UDP套接字编程)

文章目录 一、简单理解Socket 套接字二、UDP 数据报套接字编程三、编写简单的 UDP 版本服务器客户端1. 编写 UDP 版本的回显服务器回显服务器整体代码罗列 2. 编写 UDP 版本的回显客户端回显客户端整体代码罗列 四、总结与代码运行结果解释 一、简单理解Socket 套接字 概念&am…

100天精通Golang(基础入门篇)——第18天:深入解析Go语言中的结构体

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to Golang Language.✨✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1…

半导体芯片介质膜层膜层膜厚测量仪

镀膜是半导体芯片制备过程中的重要步骤。在一个完整的CMOS工艺流程中&#xff0c;介质膜层(保护层、外延层、光刻胶和栅极氧化物等)与金属沉积层交替出现。随着芯片工艺节点不断进步&#xff0c;介质膜层也变得越来越复杂&#xff0c;在7nm工艺中&#xff0c;所需测量的介质膜堆…

AppStream下载元数据失败

错误&#xff1a;为仓库 AppStream 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist 目录 一、域名解析 二、CentOS-AppStream.repo 三、CentOS-Base.repo 四、CentOS-Extras.repo 五、rpm更新 一、域名解析 先验证 ping www.baidu.com 不…

STM32基于CubeIDE和HAL库 基础入门学习笔记:物联网项目开发流程和思路

文章目录&#xff1a; 第一部分&#xff1a;项目开始前的计划与准备 1.项目策划和开发规范 1.1 项目要求文档 1.2 技术实现文档 1.3 开发规范 2.创建项目工程与日志 第二部分&#xff1a;调通硬件电路与驱动程序 第三部分&#xff1a;编写最基础的应用程序 第四部分&…

基于dbn+svr的交通流量预测,dbn详细原理

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) DBN+SVR的交通流量预测 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,是一种非常好的分类算法,本文将DBN+SVR用于交通流量预测…

怎样才能免费使用Qt开发闭源商业软件?

Qt 是一个跨平台的应用程序开发框架&#xff0c;其使用遵循 GNU Lesser General Public License&#xff08;LGPL&#xff09;开源许可协议。根据 LGPL 许可协议&#xff0c;您可以将 Qt 用于闭源商业软件&#xff0c;但是您需要满足以下条件&#xff1a; 1. 在您的软件中使用…