【每日一题】1289. 下降路径最小和 II

news2024/11/25 13:52:43

【每日一题】1289. 下降路径最小和 II

  • 1289. 下降路径最小和 II
    • 题目描述
    • 解题思路

1289. 下降路径最小和 II

题目描述

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

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

示例 1:

在这里插入图片描述

输入:grid = [[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

解题思路

思路:下降路径最小和的变体,动态规划+优化。该题与下降路径最小和的区别是,下降路径最小和的当前元素只能由上一行左上角、正上方、右上角而来,而该题的当前元素只是不能从正上方来。最直观的想法是,加一层循环用于统计上一行的非当前列的最小值,但是这样时间复杂度就变成了O(N3),虽然C++也能过。

int minFallingPathSum(vector<vector<int>>& grid) 
{
   int n=grid.size();
   if(n==1)
     return grid[n-1][n-1];
   //dp[i][j]表示第i行选择第j列累积的下降路径最小和
   vector<vector<long>> dp(n+2,vector<long>(n+2,0));
   //最左边和最右边两列需要赋值为INT_MAX 即不可选择对应行上的这些元素 特殊处理
   for(int k=1;k<=n;k++)
   {
     dp[k][0]=INT_MAX;
     dp[k][n+1]=INT_MAX;
   }
   long res=INT_MAX;
   for(int i=1;i<=n;i++)
   {
      for(int j=1;j<=n;j++)
      {
          long temp=INT_MAX;
          //加一层循环用于统计上一行的非当前列的最小值
          for(int k=1;k<=n;k++)
          {
             if(k!=j)
               temp=min(temp,dp[i-1][k]);
          }
          dp[i][j]=temp + grid[i-1][j-1];
          if(i==n) //最后一行 收集结果
            res=min(res,dp[i][j]);
       }
    }
    return res;
}

优化:上述O(n3)时间复杂度虽然也确实能过,但是还有优化的空间。因为在计算当前行每一个元素对应的下降路径最小和时,都需要计算一次上一行的非当前列的下降路径最小和,这样就需要计算n次,这其中有很多是重复的,所以我们需要优化此处。即思考如何一次性计算上一行的非当前列的下降路径最小和呢?计算上一行的非当前列的下降路径最小和其实可以分两个部分考虑:如果上一行的当前列不是最小值,那么直接就取上一行的最小值;如果上一行的当前列是最小值,那么就选择上一行的次小值。也就是说,对于每一行记录当前行的最小值和次小值以及最小值的下标,这样就可以为下一行所用啦,从而将计算上一行的非当前列的下降路径最小和的O(N)时间复杂度优化为O(1)时间复杂度,即整体O(N3)的时间复杂度优化为O(N2)。

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& grid) {
        //要从上一行中选出最小值,但不能和当前数字在同一列,所以要考虑到同列的情况下用次小值
        int n=grid.size();
        if(n==1)
            return grid[n-1][n-1];
        //这一行下降和的最小值 这一行最小值对应的下标 这一行的次小值
        int first_sum=0,first_pos=-1,second_sum=0;  //上一轮的
        for(int i=0;i<n;i++) 
        {
            //记录这一行的最小值、最小值对应的下标、次小值
            int fs=INT_MAX,fp=-1,ss=INT_MAX;  //用于求当前的
            for(int j=0;j<n;j++)
            {
                int cur_sum=(first_pos!=j?first_sum:second_sum)+grid[i][j];
                if(cur_sum<fs)  //找到更小的
                {
                    ss=fs;   //将更小的赋值给次小的
                    fs=cur_sum;   //将当前的赋值给最小的
                    fp=j;   //记录最小对应的位置
                }
                else if(cur_sum<ss)  //不比最小小 比次小小 更新次小
                {
                    ss=cur_sum;
                }
            }
            //为下一行做准备
            first_sum=fs;
            first_pos=fp;
            second_sum=ss;
        }
        //最后一行最小值
        return first_sum;
    }
};

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

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

相关文章

【计算机视觉】简述对EQ-Net的理解

最近又看了一些点云分割的文章&#xff0c;近两年点云分割的文章是真的少&#xff0c;不知道是不是点云分割算法接近了末端。这篇文章主要提出了一个基于查询方法的统一范式&#xff0c;它解决了一些不仅仅是点云分割的问题&#xff0c;还解决了三维点云分类和三维目标检测的问…

解密AI图像安全技术:智能守护数智时代,低代码平台助力圈复杂操作!

前言 随着数智时代的来临&#xff0c;人们进入了一个全新的智能化世界。在这个时代中&#xff0c;人工智能&#xff08;AI&#xff09;成为了一项重要的技术突破&#xff0c;其应用也无处不在。其中&#xff0c;AI图像安全技术作为保障个人和企业数据安全的重要环节&#xff0c…

Linux——认识Linux的目录结构 常用命令 vim命令 权限及其控制

目录 linux的目录结构常用linux的命令ls(list)和llcd 切换目录mkdir 创建文件夹touch命令&#xff1a;创建普通文本文件pwd 显示路径whoamisu&#xff1a;普通--超级账号man&#xff1a;查看手册rm&#xff1a;删除网络命令ifconfig重定向 >>cat 查看文本文件clear清屏hi…

3.2 Bootstrap 下拉菜单(Dropdowns)

文章目录 Bootstrap 下拉菜单&#xff08;Dropdowns&#xff09;选项对齐标题 更多实例 Bootstrap 下拉菜单&#xff08;Dropdowns&#xff09; 本章将重点介绍 Bootstrap 下拉菜单。下拉菜单是可切换的&#xff0c;是以列表格式显示链接的上下文菜单。这可以通过与 下拉菜单&a…

NZ12:VBA给批量文件重命名

【分享成果&#xff0c;随喜正能量】沉默&#xff0c;可以让混乱的心&#xff0c;变得清澈。沉默&#xff0c;是城府&#xff0c;是睿智&#xff0c;是内涵&#xff1b;沉默&#xff0c;是最后的清高&#xff0c;也是最后的自由。。 我的教程一共九套及VBA汉英手册一部&#x…

nginx添加模块fastdfs-nginx-module(docker版,不需要重写dockerfile)

nginx添加模块fastdfs-nginx-module&#xff08;docker版&#xff0c;不需要重写dockerfile&#xff09; 一、fastdfs-nginx-module模块准备1.1、下载模块1.2、配置模块参数 二、重新制作nginx的二进制执行文件2.1、查看nginx版本2.2、下载nginx配套版本的源码文件2.3、制作ngi…

线性表综合应用题2

设计一个高效算法&#xff0c;将顺序表L的所有元素逆置&#xff0c;要求算法的空间复杂度为O(1)。 算法思想&#xff1a;扫描顺序表L的前半部分元素&#xff0c;对于元素L.data[i] (0<i<L.length/2),将其与后半部分的对应元素L.data[L.length - i - 1]进行交换。 #defi…

GC overhead limit exceeded问题

GC overhead limit exceeded问题 一、为什么会产生GC overhead limit exceeded问题 OutOfMemoryError是java.lang.VirtualMachineError的子类&#xff1b;JVM遇到与资源利用有关的问题时&#xff0c;会抛出该错误。更具体地说&#xff0c;当JVM花太多时间执行垃圾回收并且只能…

807. 区间求和

链接&#xff1a; 链接 题目&#xff1a; 输入两个整数 ll 和 rr&#xff0c;请你编写一个函数&#xff0c;int sum(int l, int r)&#xff0c;计算并输出区间 [l,r][l,r] 内所有整数的和。 输入格式 共一行&#xff0c;包含两个整数 ll 和 rr。 输出格式 共一行&#xff0c;包…

分支IPSECV批恩连接总部突然上线不了,连接其他总部正常

环境: 分支: AF8.0.17 总部设备: SSL V批恩 V7.0 AF8.0.75 问题描述: 分支IPSECV批恩连接总部突然上线不了,之前正常,连接其他总部正常 解决方案: 排查&解决 1.先在分支和总部设备各查询故障日志 分支 总部 然后在分支AF上进入系统排障页面,测试ping总…

14、Horizontal Pod Autoscale

一、为何进行缩扩容&#xff1f; 在实际生产中&#xff0c;经常会遇到某个服务需要扩容的场景&#xff0c;可能会遇到由于资源紧张或者工作负载降低而需要减少服务实例数量的场景。可以利用Deployment/RC的Scale机制来完成这些工作。 二、缩扩容模式 Kubernetes 对 Pod 扩容与缩…

【Android Framework系列】第6章 AMS原理之Launcer启动流程

1 前言 我们在上一章节【Android Framework系列】第5章 AMS启动流程中简单的分析了AMS的启动流程&#xff0c;这一章节我们来了解一下&#xff0c;通过AMS是怎么完成Activity的启动 下面我们通过Launcher启动一起来看看Activity的启动流程 本文基于Android10&#xff08;Q&a…

不同语言采集【淘宝1688拼多多API】平台数据的方式

首先我们以taobao商品页面采集商品详情数据为例&#xff1a; 请求方式&#xff1a;HTTPS POST GET 请求地址&#xff1a;API接口 请求参数 请求参数&#xff1a;num_iid669646899650&is_promotion1参数说明&#xff1a;num_iid:淘宝商品ID is_promotion:是否获取取促销…

Space Saving算法

用于大数据中统计元素数量最多的元素的算法。 SpaceSaving算法是一种近似计数算法&#xff0c;它在大多数情况下能够提供准确的结果。然而&#xff0c;它并不是完全准确的&#xff0c;因为它使用了一些近似技巧来降低内存使用。具体来说&#xff0c;SpaceSaving算法通过牺牲一定…

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(4)----测量环境光

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X----4.测量环境光 概述样品申请VL6180X传感器的测量流程ALS动态范围ALS动态范围测量流程光强计算公式配置vl6180x测试结果 概述 在本章中&#xff0c;我们将介绍如何配置VL6180X传感器以测量环境光&#xff0c;并获取环境光的强度值…

I.MX8MM系统构建 -- 2.linux内核编译烧录

准备源码 源码位置&#xff1a;/source/myir-imx-linux.tar.gz解压源码 tar zxf myir-imx-linux.tar.gz 编译 进入源码目录后&#xff0c;依次执行下列指令 myirmyir-server1:$ make distclean myirmyir-server1:$ make myd_imx8mm_defconfig myirmyir-server1:$ LDFLAG…

代码随想录刷题第53天|Leetcode1143最长公共子序列

1、Leetcode1143最长公共子序列 题目链接&#xff1a;1143最长公共子序列 本题不要求连续&#xff0c;求最长公共子序列。 1、确定dp数组及下标的含义 dp[i][j]&#xff1a;长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]。 2、…

volatile原理剖析和实例讲解

一、是什么 volatile是Java的一个关键字&#xff0c;是Java提供的一种轻量级的同步机制&#xff0c; 二、能做什么 保证了不同线程对这个变量进行操作时的可见性&#xff0c;有序性。 三、可见性 可见性主要是指一个线程修改了共享变量的值&#xff0c;另一个线程可以看见…

PreparedStatement 相比于 Statement的优点

PreparedStatement 相比于 Statement&#xff0c;有以下几个优点&#xff1a; 1. 预编译&#xff1a;PreparedStatement 对象在执行 SQL 语句之前会进行预编译&#xff0c;这意味着数据库管理系统可以提前解析和编译 SQL 语句&#xff0c;以优化执行计划&#xff0c;从而提高查…

【C语言初阶(15)】操作符1

文章目录 Ⅰ操作符的分类Ⅱ 算术操作符Ⅲ 移位操作符⒈左移操作符⒉右移操作符 Ⅳ 位操作符⒈按位取⒉按位与⒊按位异或⒋按位或⒌位操作符练习题 Ⅴ赋值操作符Ⅵ 单目操作符 Ⅰ操作符的分类 算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符…