【力扣每日一题】2023.8.10 下降路径最小和Ⅱ

news2024/10/8 12:20:23

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目给我们一个数组,让我们模拟从上面第一层走到下面的最后一层,下降路径需要加上经过的格子的值,每层走的格子不能和相邻层走的格子在同一列,让我们返回下降路径的最小和。

那既然是要路径的总和最小,那么我每次都只选择最小的数不就好啦。

不过相邻行的最小元素所在的列可能是会一样的,这样我们就不能直接无脑选择最小了,我们每次选择本行经过哪一格的时候,需要做个判断,只要你这格子的列跟我上一行最小数的列不一样,那么我就在你这格子的值我再加上上一层的最小值,这样就可以表示我从上面的最小格走到你这边,这格的数就是我从上面走到这个格子的下降路径和,我们这样不断累加,直到最后统计最后一行的最小值,那就是总的下降路径最小和了。

不过还有一个问题,和上一行最小值的不同列的格子我们都更新数值了,那么同列的格子我们应该怎么更新呢?我们可以记录下第二小的数,如果一个格子和上一列的最小数同列,那么它就不会和第二小的数同列,既然无法加最小的数,那么退而求其次,我加上第二小的数也凑合。

所以我们需要维护两个变量,分别来存储上一层第一小的元素和列下标以及上一层第二小的元素和列下标。

我们还需要在遍历每层的时候就更新这两个变量,作为下一层的上一层最小元素,但是这样会造成数据污染,如果我还没遍历完整层元素就把这两个变量给更新了,那么本层中后面的格子可能用的就不是上一层的最小数而是本层的最小数了。

所以我们其实一共需要四个变量,两个变量一样是存储上一层的第一小和第二小的元素和列下标。另外两个变量就用来存储本层的第一小和第二小元素和列下标。在遍历完整层之后,再将上一层的两个变量更新为本层的两个变量。

最后我们返回最后一层的最小值,那就是我们要返回的下降路径最小和了。

代码:

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& grid) {
        int n=grid.size();
        if(n==1) return grid[0][0];
        pair<int,int>min1{-1,0},min2{-1,0}; //初始化成最小次小都为0,这样在第一层操作的时候就不会有影响

        for(int i=0;i<n;i++){
            pair<int,int>min11{0,INT_MAX},min22{0,INT_MAX}; //记录本层的最小和次小,用于更新
            for(int j=0;j<n;j++){
                if(j!=min1.first) grid[i][j]+=min1.second;  //如果不是和上层最小的列一样就添加最小.
                else grid[i][j]+=min2.second;   //反之添加次小.

                if(grid[i][j]<min11.second){    //更新本层的最小
                    min22=min11;    //最小更新以后,之前的最小就是现在的次小
                    min11.first=j;
                    min11.second=grid[i][j];
                }else if(grid[i][j]<min22.second){  //更新本层的次小
                    min22.first=j;
                    min22.second=grid[i][j];
                }
            }
            min1=min11;min2=min22;  //更新
        }
        return min1.second;
    }
};

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

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

相关文章

vue使用ElementUI

1.安装 npm i element-ui -S 2.引入 2.1完整引入 import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue;Vue.use(ElementUI); 2.2按需引入 说明&#xff1a;为了输入时候有提示&#xff0c;建…

【雕爷学编程】Arduino动手做(03)---RCWL-0516微波雷达传感器模块2

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

S7-1500系列PLC读取V90伺服驱动器电流扭矩等参数的具体方法示例(2种)

S7-1500系列PLC读取V90伺服驱动器电流扭矩等参数的具体方法示例(2种) 示例1: 当V90PN配置为EPOS控制模式下的标准报文111时,报文中在接受与发送方向均包含一个可供用户自定义的保留字(PZD12)。 在这种条件下,可以通过修改参数P29151(用户自定义PZD发送字)来定义传输方…

YOLOV5改进:更换为MPDIOU,实现有效涨点

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点。 2.涨点效果:更换为MPDIOU,实现有效涨点! 目录…

【雕爷学编程】Arduino动手做(201)---DFRobot 行空板03

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

三种常见的平滑滤波方法

一、概述 平滑滤波&#xff0c;顾名思义就是对信号进行处理使之整体显得更加平滑&#xff0c;降低噪声影响&#xff0c;提高信号质量&#xff0c;它常见于数学信号处理和图像处理&#xff0c;一般意义上的数字信号多体现于一维数据&#xff0c;图像信号多体现于二维数据。   …

基于Java的体育网站的设计与实现(论文+源码)_kaic

基于Java的体育网站的设计与实现 摘 要&#xff1a;在网络应用的迅速发展与科技的不断进步的现代环境下&#xff0c;人们生活节奏越来越快&#xff0c;娱乐方式也多种多样&#xff0c;各种软件应用&#xff0c;各种娱乐&#xff0c;购物网站已经成为必不可少的伴随品&#xff…

Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群

JenkinsDockerSpringCloud微服务持续集成项目优化和微服务集群 JenkinsDockerSpringCloud部署方案优化JenkinsDockerSpringCloud集群部署流程说明修改所有微服务配置 设计Jenkins集群项目的构建参数编写多选项遍历脚本多项目提交进行代码审查多个项目打包及构建上传镜像把Eurek…

一种简单高效的IMU姿态解算方法

这里给出一种简单高效的IMU姿态解算方法&#xff0c;本方法的特点就是思路非常的简单&#xff0c;并且效果也还可以&#xff0c;地面机器人这类运动想对不那么剧烈的应用应该是能应付的&#xff0c;但是震动较大的无人机、足式机器人等应用是否能应用还有待试验。 代码如下&am…

【Leetcode】(自食用)LRU算法(哈希链表法)

step by step. 题目&#xff1a; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键…

【深度学习注意力机制系列】—— CBAM注意力机制(附pytorch实现)

CBAM&#xff08;Convolutional Block Attention Module&#xff09;是一种用于增强卷积神经网络&#xff08;CNN&#xff09;性能的注意力机制模块。它由Sanghyun Woo等人在2018年的论文[1807.06521] CBAM: Convolutional Block Attention Module (arxiv.org)中提出。CBAM的主…

实现静态资源访问的几种方法

什么是静态资源&#xff1f; 静态资源是指在服务器端存储的不会变化的文件&#xff0c;如HTML、CSS、JavaScript、图片、音频、视频等文件。这些文件一般不包含动态内容&#xff0c;每次请求时返回的内容都是固定的。 为什么要使用静态资源&#xff1f; 提升网站性能&#xf…

gitblit-使用

1.登入GitBlit服务器 默认用户和密码: admin/admin 2.创建一个新的版本库 点击图中的“版本库”&#xff0c;然后点击图中“创建版本库” 填写名称和描述&#xff0c;注意名称最后一定要加 .git选择限制查看、克隆和推送勾选“加入README”和“加入.gitignore文件”在图中的1处…

kafka-2.12使用记录

kafka-2.12使用记录 安装kafka 2.12版本 下载安装包 根据你的系统下载rpm /deb /zip包等等, 这里我使用的是rpm包 安装命令 rpm -ivh kafka-2.12-1.nfs.x86_64.rpm启动内置Zookeeper 以下命令要写在同一行上 /opt/kafka-2.12/bin/zookeeper-server-start.sh /opt/kafka-2…

5.3.7.自动创建字符设备驱动的设备文件 class_create device_create

5.3.7.自动创建字符设备驱动的设备文件 5.3.7.1、问题描述&#xff1a; (1)整体流程回顾 (2)使用mknod创建设备文件的缺点 (3)能否自动生成和删除设备文件 5.3.7.2、解决方案&#xff1a;udev是PC机&#xff08;嵌入式中用的是mdev&#xff09; (1)什么是udev&#xff1f;应用层…

C语言笔记6

关于microsoft visual 的学习笔记 CtrlF5就是启动编译程序 先CtrlA进行全选&#xff0c;然后AitF8就自动的调节代码的格式 #include <stdio.h> #include <stdlib.h> int main() {//system启动程序(在一个程序中启动另外一个程序)//如果程序环境变量中找不到程序&am…

OpenCV实战(29)——视频对象追踪

OpenCV实战&#xff08;29&#xff09;——视频对象追踪 0. 前言1. 追踪视频中的对象2. 中值流追踪器算法原理3. 完整代码小结系列链接 0. 前言 我们已经学习了如何跟踪图像序列中点和像素的运动。但在多数应用中&#xff0c;通常要求追踪视频中的特定移动对象。首先确定感兴趣…

FFmpeg安装和使用

sudo apt install ffmpeg sudo apt-get install libavfilter-devcmakelist模板 CMakeLists.txt cmake_minimum_required(VERSION 3.16) project(ffmpeg_demo)# 设置ffmpeg依赖库及头文件所在目录&#xff0c;并存进指定变量 set(ffmpeg_libs_DIR /usr/lib/x86_64-linux-gnu) …

SpringBoot自动装配及run方法原理探究

自动装配 1、pom.xml spring-boot-dependencies&#xff1a;核心依赖在父工程中&#xff01;我们在写或者引入一些SpringBoot依赖的时候&#xff0c;不需要指定版本&#xff0c;就因为有这些版本仓库 1.1 其中它主要是依赖一个父工程&#xff0c;作用是管理项目的资源过滤及…

冠达管理:“高温超导”不是“室温超导”,5天4板百利电气再次澄清

短短半个月&#xff0c;“室温超导”在惊喜、质疑间回转&#xff0c;但资本市场对“超导概念股”的炒作还在进行&#xff0c;8月7日室温超导概念持续疯涨。同花顺显现&#xff0c;到8月7日收盘&#xff0c;18只超导概念股中&#xff0c;有16只股票飘红。 广东研山私募证券投资&…