LeetCode 3148.矩阵中的最大得分:每个元素与其左或上元素之差的最大值(原地修改O(1)空间)

news2024/11/14 17:03:53

【LetMeFly】3148.矩阵中的最大得分:每个元素与其左或上元素之差的最大值(原地修改O(1)空间)

力扣题目链接:https://leetcode.cn/problems/maximum-difference-score-in-a-grid/

给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格(不必相邻)。从值为 c1 的单元格移动到值为 c2 的单元格的得分为 c2 - c1

你可以从 任一 单元格开始,并且必须至少移动一次。

返回你能得到的 最大 总得分。

 

示例 1:

输入:grid = [[9,5,7,3],[8,9,6,1],[6,7,14,3],[2,5,3,1]]

输出:9

解释:从单元格 (0, 1) 开始,并执行以下移动:
- 从单元格 (0, 1) 移动到 (2, 1),得分为 7 - 5 = 2
- 从单元格 (2, 1) 移动到 (2, 2),得分为 14 - 7 = 7
总得分为 2 + 7 = 9

示例 2:

输入:grid = [[4,3,2],[3,2,1]]

输出:-1

解释:从单元格 (0, 0) 开始,执行一次移动:从 (0, 0)(0, 1) 。得分为 3 - 4 = -1

 

提示:

  • m == grid.length
  • n == grid[i].length
  • 2 <= m, n <= 1000
  • 4 <= m * n <= 105
  • 1 <= grid[i][j] <= 105

解题方法:动态规划

从a移动到b,再从b移动到c,等价于直接从a移动到c。

因此要求的,就是对所有的a到c中,c-a的最大值。

怎么求?很简单,在遍历原始数组的时候将每个值修改为这个元素、这个元素左上方(包含)所有元素的最小值

这样,对应下标为(i, j)的元素,其左上方的最小值就是min(grid[i - 1][j], grid[i][j - 1])。

使用grid[i][j]减去这个“最小值”,即为从任意一点移动到(i, j)所得的最大得分(只能往右或下移动)。

所有的最大得分中,最大的那个即为所求。

  • 时间复杂度 O ( s i z e ( g r i d ) ) O(size(grid)) O(size(grid))
  • 空间复杂度 O ( 1 ) O(1) O(1):可以直接修改grid数组的话,空间复杂度就是O(1)

AC代码

C++
class Solution {
public:
    int maxScore(vector<vector<int>>& grid) {
        int ans = grid[0][1] - grid[0][0];
        for (int i = 0; i < grid.size(); i++) {
            for (int j = 0; j < grid[0].size(); j++) {
                int original = grid[i][j];
                if (i > 0) {
                    grid[i][j] = min(grid[i][j], grid[i - 1][j]);
                    ans = max(ans, original - grid[i - 1][j]);
                }
                if (j > 0) {
                    grid[i][j] = min(grid[i][j], grid[i][j - 1]);
                    ans = max(ans, original - grid[i][j - 1]);
                }
            }
        }
        return ans;
    }
};

执行用时分布119ms击败99.11%;消耗内存分布55.80MB击败87.46%。

Python
from typing import List

class Solution:
    def maxScore(self, grid: List[List[int]]) -> int:
        ans = grid[0][1] - grid[0][0]
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                original = grid[i][j]
                if i > 0:
                    grid[i][j] = min(grid[i][j], grid[i - 1][j])
                    ans = max(ans, original - grid[i - 1][j])
                if j > 0:
                    grid[i][j] = min(grid[i][j], grid[i][j - 1])
                    ans = max(ans, original - grid[i][j - 1])
        return ans
Java
import java.util.List;

class Solution {
    public int maxScore(List<List<Integer>> grid) {
        int ans = -100000000;
        for (int i = 0; i < grid.size(); i++) {
            for (int j = 0; j < grid.get(0).size(); j++) {
                int original = grid.get(i).get(j);
                if (i > 0) {
                    grid.get(i).set(j, Math.min(grid.get(i).get(j), grid.get(i - 1).get(j)));
                    ans = Math.max(ans, original - grid.get(i - 1).get(j));
                }
                if (j > 0) {
                    grid.get(i).set(j, Math.min(grid.get(i).get(j), grid.get(i).get(j - 1)));
                    ans = Math.max(ans, original - grid.get(i).get(j - 1));
                }
            }
        }
        return ans;
    }
}
Go
package main


func min(a int, b int) int {
    if a < b {
        return a
    }
    return b
}

func max(a int, b int) int {
    if a > b {
        return a
    }
    return b
}

func maxScore(grid [][]int) int {
    ans := -12345678
    for i, line := range grid {
        for j, item := range line {
            original := item
            if i > 0 {
                grid[i][j] = min(grid[i][j], grid[i - 1][j])  // 这里修改item的值不会改变grid[i][j]的值
                ans = max(ans, original - grid[i - 1][j])
            }
            if j > 0 {
                grid[i][j] = min(grid[i][j], grid[i][j - 1])
                ans = max(ans, original - grid[i][j - 1])
            }
        }
    }
    return ans
}

End

44CC44Gt44GZ44Gn44Kr44OQ44Gr5b2T5pysCg==

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/141234633

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

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

相关文章

ESVC论文笔记

ESVC: COMBINING ADAPTIVE STYLE FUSION AND MULTI-LEVEL FEATURE DISENTANGLEMENT FOR EXPRESSIVE SINGING VOICE CONVERSION阅读笔记 发现问题 虽然SVC在自然度和相似度方面都取得了很好的效果,但音频中除了歌手身份之外,情感表达也是传递歌手感情和态度的必要条件&#xf…

17.实现一个算法根据电话按键上的数字和字母的映射关系,输入一个或多个数字返回所有它能表示的全部字母组合

17. Letter Combinations of a Phone Number 题目 Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent. A mapping of digit to letters (just like on the telephone buttons) is given belo…

电子音乐制作软件有哪些 电音制作用什么软件 好用的能够创作音乐的软件推荐 电音基础新手入门

电子音乐目前已经成为了年轻人的一大爱好&#xff0c;而全国各地随处可见的音乐节更是代表着电子音乐文化已经逐渐被年轻人所接受&#xff0c;在这样的大背景下&#xff0c;一些年轻人也开始了自己创作电子音乐的道路。现在有了软件的帮助&#xff0c;我们能够更加随心所欲的创…

卡码网KamaCoder 110. 字符串接龙

题目来源&#xff1a;110. 字符串接龙 C题解1&#xff1a;深度搜索。一条路径走到黑&#xff0c;并且记录到达当前节点的最短路径长度&#xff0c;不断更新&#xff0c;如果不是最短路径就不用再遍历那条路。 #include <iostream> #include <vector> #include <…

数据结构基本概念和术语

概论 1.1 基本概念和术语 1.1.1 基本概念 计算机处理的的是数值性数据&#xff0c;当计算机处理用户信息表中的数据的时候&#xff0c;需要弄清3个问题 1.数据的逻辑结构 数据之间存在怎样的内在联系&#xff0c;数据中&#xff0c;有且只有一个是首节点/尾结点&#xff0…

Squish 8.0现已发布

本文翻译自&#xff1a;Squish 8.0 Available Now 原文作者&#xff1a;Qt Group质量保证高级解决方案工程师Katarina Behrens 审校&#xff1a;Jinjing Li Squish团队非常激动地宣布Squish GUI Tester 8.0现已发布。对于自动化跨平台GUI测试而言&#xff0c;这是一款软件质量…

41-设计规则:线宽规则

1.设置电源线规则和信号线规则 2.设置信号线规则 3.设置电源线规则 如果未生效&#xff1a; ① 提升优先级即可。 ②查看使能选项有没有勾选

2024医疗器械网络交易服务第三方平台备案申请流程

前几天&#xff0c;小编给大家分享了药品网络交易第三方平台备案申请流程&#xff0c;好多客户就来问&#xff0c;那医疗器械网络交易服务第三方平台备案怎么办理呢&#xff1f; 今天&#xff0c;就给大家好好聊聊医疗器械网络交易服务第三方平台备案申请流程&#xff0c;供大…

Xilinx课程,就这么水灵灵地上线了~

如果你想了解&#xff1a; 如何利用精通流水线&#xff08;Pipeline&#xff09;技术&#xff0c;让电路设计效率倍增&#xff1f; 如何掌握利用性能基线指导设计流程的方法&#xff1f; 如何理解集成电路设计中的UltraFast Design Methodology Implementation设计方法学中的…

C++拾趣——编译器预处理宏__COUNTER__的应用场景

大纲 生成唯一标识符调试信息宏展开模板元编程代码 在C中&#xff0c;__COUNTER__是一个特殊的预处理宏&#xff0c;它主要被用来生成唯一的整数标识符。这个宏是由一些编译器&#xff08;如GCC和Visual Studio&#xff09;内置支持的&#xff0c;而不是C标准的一部分。它的主要…

《AI视频类工具之五——​ 开拍》

一.简介 官网:开拍 - 用AI制作口播视频用AI制作口播视频https://www.kaipai.com/home?ref=ai-bot.cn 开拍是一款由美图公司在2023年推出,利用AI技术制作的短视频分享应用。这款工具通过AI赋能,为用户提供了从文案创作、视频拍摄到视频剪辑、包装的一站式解决方案,极大地…

Using the ST-LINK/V2-1 to program and debug the STM32 on board

1. Using the ST-LINK/V2-1 to program and debug the STM32 on board To program the STM32 on the board, plug in the two jumpers on CN2 要对板上的STM32进行编程&#xff0c;请插入CN2上的两个跳线 2. 单片机供电 标有IDD的跳线JP6用于测量STM32微控制器的功耗 拆下跳…

UE5学习笔记14-动画的混合空间

零、我看视频中使用的是UE5.0左右的版本&#xff0c;我使用的是UE5.4&#xff0c;5.4中创建混合空间&#xff0c;没有看见有2D和3D混合动画空间的区分&#xff0c;具体的UE5如何创建2D的动画暂时不知道(我感觉现在创建的是3D的动画) 一、创建混合空间 1.我将所有的动画蓝图和动…

vue用户管理、角色管理和部门管理展示

1、用户和角色一对多&#xff0c;用户和部门多对多 2、用户管理 编辑用户时部门层级展示 角色-下拉框展示 <template><div class"s"><!-- 操作按钮 --><div class"shang"><el-input v-model"searchText" placeholde…

EXTI外部中断之对射式红外传感器计次应用案例

系列文章目录 STM32中断系统之EXTI外部中断 文章目录 系列文章目录前言一、应用案例简介二、电路接线图三、应用案例代码四、应用案例分析4.1 配置外部中断4.1.1 配置RCC时钟4.1.2 配置GPIO4.1.3 配置AFIO4.1.4 配置EXTI4.1.5 配置NVIC 4.2 编写中断函数 前言 提示&#xff1…

泛微OA系统走进腾讯大厦

企业信息化、数字化、网络化、智能化的快速发展带来了无限可能&#xff0c;但同时也带来了系统安全的严峻挑战。您准备好应对了吗? 上月由腾讯安全部、泛微联合举办的“OA 系统安全防护与腾讯iOA 零信任安全策略客户会”在腾讯滨海大厦成功举办&#xff0c;本次活动邀请了60位…

拆开一个断了FPC的墨水屏,是不是像OLED一样驱动芯片在里面

可对比查看一个OLED的屏幕拆解 拆解理由 第一次焊接驱动板时的fpc上下接问题&#xff0c;但焊接到板子上并没有达到正常的显示效果。PI补强也被撕下来。后来拔下来后发现金手指断裂。本来想用一个fpc排线连接在一起&#xff0c;但后来发现并没有达到理想效果&#xff0c;飞线…

【Python学习-UI界面】PyQt5 小部件14-QDock 子窗口

可停靠窗口是一个子窗口&#xff0c;可以保持浮动状态或附加到主窗口的指定位置。 QMainWindow类的主窗口对象保留了一块区域供可停靠窗口使用。该区域位于中央窗口部件周围。 可停靠窗口可以在主窗口内移动&#xff0c;也可以被取消停靠并由用户移动到新的区域。 样式如下: …

MinIO DataPOD 目标锁定 GPU Direct 并行文件系统

MinIO 推出针对 AI 应用的 DataPOD 参考架构 MinIO 设计了一种旨在为 AI 训练提供数据的 exascale DataPOD 参考架构。这家开源对象存储软件供应商正将其可扩展至100 PiB&#xff08;即大约112.6 PB&#xff09;的单元定位为一种替代方案&#xff0c;以取代使用 GPU Direct 技…

新中地2402期GIS特训营学员圆满结业,解锁GIS开发的无限可能!

GIS开发了解 24年8月5日&#xff0c;新中地GIS开发特训营2402期学员迎来了属于自己的结业典礼。 初入特训营&#xff0c;教与学双向奔赴 从24年3月4日开班&#xff0c;面对全新的领域&#xff0c;大家新中既有对未知的忐忑&#xff0c;更有对掌握GIS开发技术的期待 在本期学员…