【C++前缀和】1878. 矩阵中最大的三个菱形和|1897

news2024/11/22 17:07:41

本文涉及的基础知识点

C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频

LeetCode 1878. 矩阵中最大的三个菱形和

难度分:1897
给你一个 m x n 的整数矩阵 grid 。
菱形和 指的是 grid 中一个正菱形 边界 上的元素之和。本题中的菱形必须为正方形旋转45度,且四个角都在一个格子当中。下图是四个可行的菱形,每个菱形和应该包含的格子都用了相应颜色标注在图中。
在这里插入图片描述

注意,菱形可以是一个面积为 0 的区域,如上图中右下角的紫色菱形所示。
请你按照 降序 返回 grid 中三个最大的 互不相同的菱形和 。如果不同的和少于三个,则将它们全部返回。
示例 1:
在这里插入图片描述

输入:grid = [[3,4,5,1,3],[3,3,4,2,3],[20,30,200,40,10],[1,5,5,4,1],[4,3,2,2,5]]
输出:[228,216,211]
解释:最大的三个菱形和如上图所示。

  • 蓝色:20 + 3 + 200 + 5 = 228
  • 红色:200 + 2 + 10 + 4 = 216
  • 绿色:5 + 200 + 4 + 2 = 211
    示例 2:

在这里插入图片描述

输入:grid = [[1,2,3],[4,5,6],[7,8,9]]
输出:[20,9,8]
解释:最大的三个菱形和如上图所示。

  • 蓝色:4 + 2 + 6 + 8 = 20
  • 红色:9 (右下角红色的面积为 0 的菱形)
  • 绿色:8 (下方中央面积为 0 的菱形)
    示例 3:
    输入:grid = [[7,7,7]]
    输出:[7]
    解释:所有三个可能的菱形和都相同,所以返回 [7] 。
    提示:
    m == grid.length
    n == grid[i].length
    1 <= m, n <= 100
    1 <= grid[i][j] <= 105

前缀和

preSum0[r][c] 记录以gird[r,c]开始的正对角线的前缀和。随着i增加,r,c都增加。
preSum1[r][c] 记录以gird[r,c]开始的反对角线的前缀和。随着i增加,r增加,c减少。
枚举菱形的中心,时间复杂度:O(mn) 枚举菱形的变成时间复杂度:O(min(m,n)),求菱形和,利用前缀和O(1) 总时间复杂度:O(mnmin(m,n))
在这里插入图片描述

代码

核心代码

class Solution {
		public:
			vector<int> getBiggestThree(vector<vector<int>>& grid) {
				const int R = grid.size();
				const int C = grid.front().size();
				vector<vector<vector<int>>> preSum0(R, vector<vector<int>>(C, vector<int>(1)));
				auto preSum1 = preSum0;
				//初始前缀和
				for (int r = 0; r < R; r++) {
					for (int c = 0; c < C; c++) {
						for (int r1 = r, c1 = c; (r1 < R) && (c1 < C); r1++, c1++) {
							preSum0[r][c].emplace_back(grid[r1][c1]+ preSum0[r][c].back());
						}
						for (int r1 = r, c1 = c; (r1 < R) && (c1 >=0 ); r1++, c1--) {
							preSum1[r][c].emplace_back(grid[r1][c1] + preSum1[r][c].back());
						}
					}
				}
				//枚举菱形中心
				vector<int> ret;
				for (int r1 = 0; r1 < R; r1++) {
					for (int c1 = 0; c1 < C; c1++) {
						ret.emplace_back(grid[r1][c1]);
						for (int r0 = r1 - 1, r2 = r1 + 1, c0 = c1 - 1, c2 = c1 + 1,k=1; (r0 >= 0) && (c0 >= 0) && (r2 < R) && (c2 < C); r0--, c0--, r2++, c2++,k++) {
							int cur = preSum0[r0][c1][k] + preSum1[r0 + 1][c1 - 1][k] + preSum0[r1 + 1][c0 + 1][k] + preSum1[r1][c2][k];
							ret.emplace_back(cur);
						}
					}
				}
				sort(ret.begin(), ret.end(), greater<>());
				ret.erase(unique(ret.begin(), ret.end()), ret.end());
				if (ret.size() > 3) {
					ret.erase(ret.begin() + 3,ret.end());
				}
				return ret;
			}
		};

单元测试

vector<vector<int>> grid;
		TEST_METHOD(TestMethod1)
		{
			grid = { {1} };
			auto res = Solution().getBiggestThree(grid);
			AssertEx({1 }, res);
		}
		TEST_METHOD(TestMethod2)
		{
			grid = { {2,1} };
			auto res = Solution().getBiggestThree(grid);
			AssertEx({ 2,1 }, res);
		}
		TEST_METHOD(TestMethod11)
		{
			grid = { {3,4,5,1,3},{3,3,4,2,3},{20,30,200,40,10},{1,5,5,4,1},{4,3,2,2,5} };
			auto res = Solution().getBiggestThree(grid);
			AssertEx({ 228,216,211 }, res);
		}
		TEST_METHOD(TestMethod12)
		{
			grid = { {1,2,3},{4,5,6},{7,8,9} };
			auto res = Solution().getBiggestThree(grid);
			AssertEx({ 20,9,8 }, res);
		}
		TEST_METHOD(TestMethod13)
		{
			grid = { {7,7,7} };
			auto res = Solution().getBiggestThree(grid);
			AssertEx({ 7 }, res);
		}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

ElasticSearch备考 -- Update by query Reindex

一、题目 有个索引task&#xff0c;里面的文档长这样 现在需要添加一个字段all&#xff0c;这个字段的值是以下 a、b、c、d字段的值连在一起 二、思考 需要把四个字段拼接到一起&#xff0c;组成一个新的字段&#xff0c;这个就需要脚本&#xff0c; 这里有两种方案&#xff…

ES 文件浏览器批量下载的链接

在 ES 文件浏览器上的网页上下载文件需要一个一个点击下载&#xff0c;这样非常麻烦&#xff0c;实际上文件在网页上都对应有一个真实的地址&#xff0c;这样通过 For 循环可以打印出下载地址&#xff0c;然后粘贴到迅雷中就可以批量下载了 http://10.0.0.47:5050/download?pa…

【Canvas与徽章】盾形银底红带Best Quality Premium徽章

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>BestQulity金属牌Draft3</title><style type"text/css…

怎么成为年薪53万的AI产品经理?我分析了200份大厂的招聘要求

我在 BOSS 直聘搜索AI产品经理&#xff0c;筛选了公司规模在10000人以上的公司&#xff0c;清洗整理后得到 229 个岗位信息&#xff0c;分析得到如下信息&#xff1a; 按最低薪资算&#xff0c;平均年薪 40.2 万&#xff1b;取薪资范围均值&#xff0c;平均年薪 52.9 万;只有 …

判断两棵树是否相等

判断两棵树是否相等 两棵树是否相等的判断条件&#xff1a; 1. 树的结构一样 2. 对应节点存放的值相等 思路1&#xff1a; 首先对树的结果判断&#xff0c;若结构一样&#xff0c;则进行下一步节点中值的判断&#xff0c;若结构不一样&#xff0c;直接返回false 1.定义一个f…

C++ | Leetcode C++题解之第458题可怜的小猪

题目&#xff1a; 题解&#xff1a; class Solution { public:int poorPigs(int buckets, int minutesToDie, int minutesToTest) {if (buckets 1) {return 0;}vector<vector<int>> combinations(buckets 1,vector<int>(buckets 1));combinations[0][0] …

万字长文带你从底层到实战了解Python中的time模块,从基础到进阶让你轻松掌握时间管理

博客主页&#xff1a;长风清留扬-CSDN博客系列专栏&#xff1a;Python基础专栏每天更新大数据相关方面的技术&#xff0c;分享自己的实战工作经验和学习总结&#xff0c;尽量帮助大家解决更多问题和学习更多新知识&#xff0c;欢迎评论区分享自己的看法感谢大家点赞&#x1f44…

图解Linux文件属性与目录配置

Linux的文件属性十分重要&#xff0c;与windows的文件属性有很大不同&#xff0c;Linux的文件增加了许多属性&#xff0c;如读写、连接数、文件拥有者及所属群组。如果一个文件属于一个群组&#xff0c;那么这个群组的成员就可以访问&#xff0c;其他的群组就不能访问&#xff…

Qt中的网络客户端

目录 HttpClient http报文相关 HttpClient发送报文格式 x-www-form-urlencoded: multipart/form-data raw binary QUrl QNetworkAccessManager Http-Get Http-Post http-post:form-data ftp-up ftp-down QDesktopServices HttpClient http报文相关 URL是为了 统…

人机协作:科技与人类智慧的融合

随着科技的飞速发展&#xff0c;越来越多的领域开始借助人工智能&#xff08;AI&#xff09;和自动化技术来提升工作效率。人机协作&#xff08;Human-Machine Collaboration&#xff09;这一概念逐渐成为现代技术进步的核心。它不仅改变了我们的工作方式&#xff0c;也在重新定…

【STL】stack模拟实现

stack模拟实现比较简单&#xff0c;就是直接调用deque的函数即可。 具体实现&#xff1a; #pragma once#include<deque> #include<iostream>using std::istream; using std::ostream; using std::endl; using std::cout;namespace zyy { //stack -> 后进先出t…

python log函数怎么用

log() 返回 x 的自然对数。 语法 以下是 log() 方法的语法&#xff1a; import math math.log(x[, base]) 注意&#xff1a;log()是不能直接访问的&#xff0c;需要导入 math 模块&#xff0c;通过静态对象调用该方法。 参数 x -- 数值表达式。 base -- 可选&#xff0c;底…

‌图片编辑为底片,智能工具助力,创作精彩视觉作品

在当今数字化时代&#xff0c;图像编辑已成为表达创意和美化视觉作品的重要手段。借助智能工具&#xff0c;即使是初学者也能轻松驾驭图片编辑。接下为大家展示图片编辑为底片图片的效果。 1.打开“首助编辑高手”&#xff0c;选择这里“图片批量处理”版块页面上 2.导入保存有…

C语言之三子棋游戏(附完整代码)

学了那么多关于C语言的知识&#xff0c;也该进行一下实操了。三子棋游戏应该是大家学生时代课间比较喜欢娱乐消遣的一种方式吧。那么我们今天就来说说如何实现简单版本的三子棋对战小游戏吧。 三子棋游戏介绍 三子棋游戏类似于五子棋&#xff0c;不同的是它的棋盘大小是九宫格…

LLM | Ollama 安装、运行大模型(CPU 实操版)

1. 操作步骤 1.1 安装 # 通过 homebrew 安装 brew install ollama1.2 验证&#xff08;可跳过&#xff09; # 输出命令使用提示则安装成功 ollama --help1.3 启动服务端 # 启动 ollama 服务&#xff08;默认在 11434 端口&#xff0c;模型文件在 ~/.ollama&#xff09; oll…

论文阅读笔记-Pre-trained Models for Natural Language Processing: A Survey

前言 预训练模型给下游任务带来的效果不言而喻,有了预训练模型,我们可以使用它来加速解决问题的过程。正如论文中所说的那样,预训练模型(PTMs)的出现将自然语言处理(NLP)带入了一个新时代。本篇论文基于分类从四个角度对现有PTMs进行系统分类,描述如何使PTMs的知识适应…

Spring源码学习:SpringMVC(4)DispatcherServlet请求入口分析

目录 前言HttpServlet &FrameworkServletHttpServlet #serviceFrameworkServlet#processRequest DispatcherServlet#doServicedoDispatchcheckMultipartgetHandlerAbstractHandlerMapping#getHandlerRequestMappingInfoHandlerMapping#getHandlerInternalAbstractHandlerMe…

Excel-查找和引用数据-VLOOKUP 和 HLOOKUP 函数

在 Excel 中&#xff0c;VLOOKUP 和 HLOOKUP 是用于查找和引用数据的函数。下面是它们的基本用法&#xff1a; VLOOKUP 用途&#xff1a;在表格的第一列中查找某个值&#xff0c;并返回该值所在行的指定列中的数据。 语法&#xff1a; VLOOKUP(lookup_value, table_array, …

多模态大语言模型(MLLM)-Blip2深度解读

前言 Blip2是一个多模态大语言模型&#xff0c;因其提出时间较早&#xff08;2023年&#xff09;&#xff0c;且效果较好&#xff0c;很快成为一个标杆性工作。Blip2中提出的Q-former也成为衔接多模态和文本的重要桥梁。 Blip2发表时间是2023年&#xff0c;现在引用已经3288了…

产品经理内容分享(一):AI产品经理需必备那些能力

目录 必备的AI技术知识 第一章&#xff1a;AI产品经理是否需要懂技术及其程度 第二章&#xff1a;AI产品经理必备的AI技术基础知识——基础算法与机器学习方法 第三章&#xff1a;AI产品经理必须要懂的AI技术知识——场景应用 第四章&#xff1a;AI算法与模型的关系 第五…