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

ops/2024/9/19 0:43:33/ 标签: leetcode, 矩阵, 算法, 题解, 动态规划, DP

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

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

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

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

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

 

示例 1:

leetcode.com%2Fuploads%2F2024%2F03%2F14%2Fgrid1.png&pos_id=img-5mcX8RBh-1723739736313%29" />

输入: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:

leetcode.com%2Fuploads%2F2024%2F04%2F08%2Fmoregridsdrawio-1.png&pos_id=img-3p4iEDCs-1723739767168%29" />

输入: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 Listclass 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 mainfunc 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 := -12345678for i, line := range grid {for j, item := range line {original := itemif 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.ppmy.cn/ops/96747.html

相关文章

(2024)vue2+vue3学习笔记(持续更新)

// 判断属性是否为空 // trim去除收尾空格 if(this.todoName.trim() "){alert(请输入任务名称)return } // unshift 添加到数组最前面 this.list.unshift({id: new Date()name: this.todoName }) v-model修饰符 .trim .number <h3>v-model修饰符 .trim .number…

C语言——文件

文件操作 概念 文件是指存储在外存储器上&#xff08;一般代指磁盘&#xff0c;也可以是U盘&#xff0c;移动硬盘等&#xff09;的数据的集合。 文件操作体现在哪几个方面 1.文件内容的读取 2.文件内容的写入 数据的读取和写入可被视为针对文件进行输入和输出的操作&#xf…

多线程(1)

1、wait 函数 宏定义&#xff1a;WIFEXITED&#xff08;&#xff09; WEXITSTATUS&#xff08;&#xff09; 调用进程 一般不做额外的事情 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <…

探索HarmonyOS位置服务:为用户提供直观的坐标显示

在先前的环节中&#xff0c;我们所获取到的位置信息是以经纬度的方式来呈现。不可否认&#xff0c;这种呈现方式在描述位置时具有极高的准确性&#xff0c;能够精确地定位到地球的每一个点。然而&#xff0c;不得不承认的是&#xff0c;对于普通用户而言&#xff0c;经纬度的表…

代码随想录算法训练营第十八天(二叉树 六)

力扣题部分: 530.二叉搜索树的最小绝对差 题目链接:. - 力扣&#xff08;LeetCode&#xff09; 题面: 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 思路: 写关于二…

【电路笔记】-无源衰减器总结

无源衰减器总结 文章目录 无源衰减器总结1、概述2、L-型无源衰减器设计3、T-型无源衰减器设计4、桥接 T 型衰减器设计5、π型无源衰减器设计无源衰减器是一个纯电阻网络,可用于控制输出信号的电平。 1、概述 无源衰减器是一种纯电阻网络,用于削弱或“衰减”传输线的信号电平…

[RCTF2015]EasySQL1

打开题目 点进去看看 注册个admin账户&#xff0c;登陆进去 一个个点开看&#xff0c;没发现flag 我们也可以由此得出结论&#xff0c;页面存在二次注入的漏洞&#xff0c;并可以大胆猜测修改密码的源代码 resoponse为invalid string的关键字是被过滤的关键字&#xff0c;Le…

uniapp使用live-pusher进行人脸识别打卡(安卓跟ios)

效果图 代码 使用live-pusher <live-pusher idlivePusher class"livePusher" mode"FHD" beauty"0" whiteness"0" aspect"9:16"min-bitrate"1000" audio-quality"16KHz" device-position"fron…

大数据原生集群 (Hadoop3.X为核心) 本地测试环境搭建一

说明&#xff1a;本篇开始主要是对前面的Hadoop2.x大数据组件搭建博文做Hadoop3.x集群搭建方法的升级&#xff0c;不过只会设计到将Hadoop升级为3.x后&#xff0c;受影响的组件&#xff0c;其他的如果没发生变动则不会再写一遍&#xff0c;毕竟没有必要&#xff0c;不过如果搭建…

开发一个微信小程序商城需要哪些技术栈

开发一个小程序商城需要掌握以下技术栈&#xff1a;‌ 前端技术&#xff1a;‌包括HTML、‌CSS和JavaScript&#xff0c;‌用于定义商城的页面结构、‌样式设计和交互功能。‌ 微信小程序专用技术&#xff1a;‌如WXML、‌WXSS、‌JavaScript和JSON&#xff0c;‌用于描述小程…

海外媒体投稿:怎样在法国媒体发稿宣传中获得成功

法国是一个充满机遇的销售市场&#xff0c;而媒体发稿营销推广是企业在法国市场里扩张曝光度和提升知名度的有效途径。下面我们就共享如何运用低投资得到高收益的办法&#xff0c;帮助企业在法国媒体发稿推广过程中获得成功。 第一步&#xff1a;掌握目标群体在进行法国媒体发稿…

JVM垃圾回收算法有哪些

JVM垃圾回收算法有哪些 标记清除算法(mark and sweep) 将垃圾回收分为两个阶段:标记和清除 根据可达性分析算法得出的垃圾进行标记 对标记的内容进行垃圾回收 优点: 标记和清除速度较快 缺点: 碎片化较为严重,内存不连贯 标记整理算法 记录存活的对象,清除需要回收的对…

C# Dictionary->ConcurrentDictionary和哈希表

一、C# Dictionary C# 中的 Dictionary 是一个用于存储键值对的集合。每个键必须是唯一的&#xff0c;且每个键对应一个值。Dictionary 提供了快速查找、添加和删除键值对的功能。 基本用法如下&#xff1a; // 创建一个 Dictionary Dictionary<int, string> dictiona…

淘宝天猫详情接口API:实现轻松购物,探索最具性价比的商品

随着电子商务的蓬勃发展&#xff0c;网络购物已经成为现代人日常生活中的重要部分。在这个浩瀚的电商海洋中&#xff0c;淘宝和天猫无疑是最为耀眼的两大平台。然而&#xff0c;如何在众多的商品中挑选出性价比最高的产品&#xff1f;淘宝天猫详情接口API为您提供了解决方案。 …

SSH远程管理/TCP Wrappers访问控制

文章目录 SSH远程管理/TCP Wrappers访问控制SSH(Secure Shell)协议OpenSSH配置信息服务监听选项用户登录控制登录验证方式 常用目录---ssh 远程安全登录---scp 远程安全复制---sftp FTP上下载 配置密钥对验证环境配置ECDSA算法RSA算法RSA算法实操在centos7 IP:20.0.0.51操作一、…

ensp小实验(ospf+dhcp+防火墙)

前言 今天给大家分享一个ensp的小实验&#xff0c;里面包含了ospf、dhcp、防火墙的内容&#xff0c;如果需要文件的可以私我。 一、拓扑图 二、实训需求 某学校新建一个分校区网络&#xff0c;经过与校领导和网络管理员的沟通&#xff0c;现通过了设备选型和组网解决方案&…

云原生 | Kubernetes 之常用 CNI 网络插件简述与对比

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] Kubernetes 集群里常用的网络插件简述与对比 Kubernetes 需要使用网络插件来提供集群内部和集群外部的网络通信&#xff0c;并提供可扩展和高性能的网络架构&#xff0c;其核心概念如下&#xff1…

Kotlin Multiplatform 跨平台开发的优化策略与实践

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 Kotlin Multiplatform 跨平台开发的优化策略与实践 在当今快速发展的软件开发领域&#xff0c;跨平台开发技术正变得越来越重要。Kotlin Multi…

浅析 Vuex 设计模式

目录 Vuex 的核心概念 1. State 2. Getters 3. Mutations 4. Actions 5. Modules Vuex 的设计模式 单一状态树 可预测的状态变更 响应式 严格模式 优势 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它集中管理应用的所有组件的状态,使得状态变更可预测。…

【STM32 FreeRTOS】Tickless低功耗模式

STM32低功耗模式 STM32 提供了 3 种低功耗模式&#xff0c;以达到不同层次的降低功耗的目的 睡眠模式&#xff08;内核停止工作&#xff0c;外设仍在运行&#xff09;停止模式&#xff08;所有时钟都停止&#xff09;待机模式&#xff08; 1.8 V 内核电源关闭&#xff09; Fr…