【独家OD2023C卷真题】20天拿下华为OD笔试【贪心】2023C-分配土地最大面积【欧弟算法】全网注释最详细分类最全的华为OD真题题解
文章目录
- 题目描述与示例
- 题目描述
- 输入描述
- 输出描述
- 备注
- 示例一
- 输入
- 输出
- 说明
- 示例二
- 输入
- 输出
- 说明
- 解题思路
- 单种颜色的最小覆盖面积
- 多种颜色的最小覆盖面积
- 代码
- Python
- Java
- C++
- 时空复杂度
- 华为OD算法/大厂面试高频题算法练习冲刺训练
题目描述与示例
题目描述
从前有个村庄,村民们喜欢在各种田地上插上小旗子,旗子上标识了各种不同的数字。某天集体村民决定将覆盖相同数字的最小矩阵形的土地的分配给为村里做出巨大贡献的村民,请问,此次分配土地,做出贡献的村民中最大会分配多大面积?
输入描述
第一行输入 m 和 n,m 代表村子的土地的长,n 代表土地的宽
第二行开始输入地图上的具体标识
输出描述
输出需要分配的土地面积,即包含相同数字旗子的最小矩阵中的最大面积。
备注
旗子上的数字为 1-500,土地边长不超过 500 未插旗子的土地用 0 标识
示例一
输入
3 3
1 0 1
0 0 0
0 1 0
输出
9
说明
土地上的旗子为 1,其坐标分别为(0,0),(2,1)以及(0,2),为了覆盖所有旗子,矩阵需要覆盖的横坐标为 0 和 2,纵坐标为 0 和 2,所以面积为 9,即(2-0+1)*(2-0+1)=9。
示例二
输入
3 3
1 0 2
0 0 0
0 3 4
输出
1
说明
由于不存在成对的小旗子,故而返回 1,即一块土地的面积。
解题思路
这道题乍一看可能没有思路。因为不同颜色的最小覆盖面积的计算是没有关联的,所以本题应该分为两个大步骤思考这个题目:
- 如何计算单种颜色的最小覆盖面积
- 求出所有颜色的最小覆盖面积中的最大值
单种颜色的最小覆盖面积
一个矩形的面积取决于四条边的位置。以示例一为例,如果要覆盖所有包含1的旗子,矩阵的上、下、左、右必须分别位于0,3,0,3的位置。故此时矩形的最小覆盖面积为(3-0)*(3-0) = 9
而矩形的四条边的位置则取决于同色旗子位于位于最上边的点、位于最下边的点、最左边的点、位于最右边的点。因此我们只需要记录同种颜色的点的四个最值即可很方便地求出覆盖某种颜色的矩形的最小面积。
对于同种颜色可以用一个长度为4的列表[top, bottom, left, right]来记录这四个最值信息。对于该颜色某一个点的坐标(x, y)
- 考虑上下方向,若
- 这个点比之前记录过的最上边的点更加偏上,即
x < top,则更新top = x - 这个点比之前记录过的最下边的点更加偏下,即
x > bottom,则更新bottom = x
- 这个点比之前记录过的最上边的点更加偏上,即
- 考虑左右方向,若
- 这个点比之前记录过的最左边的点更加偏左,即
y < left,则更新left = y - 这个点比之前记录过的最下边的点更加偏下,即
y > right,则更新right = y
- 这个点比之前记录过的最左边的点更加偏左,即
这样只需遍历一次grid数组,对所有同种颜色的点都进行上述过程,就可以求出该种颜色的最小覆盖面积了。
上述分析过程,本质上也是一种贪心思想的体现,因为四个最值所围成的矩形,就一定能够覆盖插有同色旗子的所有点了。
多种颜色的最小覆盖面积
由于颜色最多有500种,我们自然不希望循环考虑500次不同的颜色,每一次都遍历grid数组。
我们希望只需一次遍历grid数组,就能够将所有颜色的最值信息都得到。考虑如何储存不同颜色的长度为4的最值信息列表,那么答案很显而易见——使用哈希表。
其中哈希表的key为不同的颜色,value为上一小节所述的长度为4的最值信息列表。
代码
Python
# 题目:【贪心】2023C-分配土地最大面积
# 分值:100
# 作者:闭着眼睛学数理化
# 算法:贪心
# 代码看不懂的地方,请直接在群上提问from collections import defaultdict
from math import inf# 输入二维矩阵的长、宽
m, n = map(int, input().split())
grid = list()
# 循环m行,每次输入长度为n的一维数组
for _ in range(m):grid.append(list(map(int, input().split())))# 构建哈希表dic,其中
# key为表示某种颜色的数字
# value为该种颜色对应的长度为4最值列表[top, bottom, left, right]
# 初始化top和left为正无穷(或者500,因为边长最大为500),
# 初始化,bottom和right为负无穷(或者-1)
dic = defaultdict(lambda : [inf, -inf, inf, -inf])# 遍历整个二维矩阵grid
for x in range(m):for y in range(n):# 获得该种颜色color = grid[x][y]# 如果没有插旗子,则直接跳过if color == 0:continue# 考虑上下方向# 如果比最上边的点更靠上,更新top,即dic[color][0]if x < dic[color][0]:dic[color][0] = x# 如果比最下边的点更靠下,更新bottom,即dic[color][1]if x > dic[color][1]:dic[color][1] = x# 考虑左右方向# 如果比最左边的点更靠左,更新left,即dic[color][2]if y < dic[color][2]:dic[color][2] = y# 如果比最右边的点更靠右,更新right,即dic[color][3]if y > dic[color][3]:dic[color][3] = y# 计算所有颜色中,最小覆盖面积的最大值
print(max((r-l+1)*(b-t+1) for t, b, l, r in dic.values()))
Java
import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int m = scanner.nextInt();int n = scanner.nextInt();int[][] grid = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {grid[i][j] = scanner.nextInt();}}Map<Integer, int[]> dic = new HashMap<>();for (int x = 0; x < m; x++) {for (int y = 0; y < n; y++) {int color = grid[x][y];if (color == 0) {continue;}if (!dic.containsKey(color)) {dic.put(color, new int[]{Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE});}int[] boundaries = dic.get(color);if (x < boundaries[0]) {boundaries[0] = x;}if (x > boundaries[1]) {boundaries[1] = x;}if (y < boundaries[2]) {boundaries[2] = y;}if (y > boundaries[3]) {boundaries[3] = y;}}}int maxArea = 0;for (int[] boundary : dic.values()) {int top = boundary[0];int bottom = boundary[1];int left = boundary[2];int right = boundary[3];int area = (bottom - top + 1) * (right - left + 1);maxArea = Math.max(maxArea, area);}System.out.println(maxArea);}
}
C++
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <climits>int main() {int m, n;std::cin >> m >> n;std::vector<std::vector<int>> grid(m, std::vector<int>(n));for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {std::cin >> grid[i][j];}}std::unordered_map<int, std::vector<int>> dic;for (int x = 0; x < m; x++) {for (int y = 0; y < n; y++) {int color = grid[x][y];if (color == 0) {continue;}if (dic.find(color) == dic.end()) {dic[color] = {INT_MAX, INT_MIN, INT_MAX, INT_MIN};}auto& boundaries = dic[color];if (x < boundaries[0]) {boundaries[0] = x;}if (x > boundaries[1]) {boundaries[1] = x;}if (y < boundaries[2]) {boundaries[2] = y;}if (y > boundaries[3]) {boundaries[3] = y;}}}int maxArea = 0;for (auto& boundary : dic) {auto& boundaries = boundary.second;int top = boundaries[0];int bottom = boundaries[1];int left = boundaries[2];int right = boundaries[3];int area = (bottom - top + 1) * (right - left + 1);maxArea = std::max(maxArea, area);}std::cout << maxArea << std::endl;return 0;
}
时空复杂度
时间复杂度:O(NM)。仅需一次遍历整个grid二维矩阵。
空间复杂度:O(K)。哈希表所占空间,其中K为颜色种类。
华为OD算法/大厂面试高频题算法练习冲刺训练
-
华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!
-
课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化
-
每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!
-
60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁
-
可上全网独家的欧弟OJ系统练习华子OD、大厂真题
-
可查看链接 大厂真题汇总 & OD真题汇总(持续更新)
-
绿色聊天软件戳
od1336了解更多
相关文章:
【独家OD2023C卷真题】20天拿下华为OD笔试【贪心】2023C-分配土地最大面积【欧弟算法】全网注释最详细分类最全的华为OD真题题解
文章目录 题目描述与示例题目描述输入描述输出描述备注示例一输入输出说明 示例二输入输出说明 解题思路单种颜色的最小覆盖面积多种颜色的最小覆盖面积 代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 从前有个村庄…...
省市区编码sql
CREATE TABLE area (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,code varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 编码,name varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 名称,parent_code varchar(64) COLLATE utf8mb4_bin DEFAULT NULL CO…...
实现电商平台与营销系统无缝集成:雅座的无代码开发与API连接
无代码开发:营销的新引擎 在数字化转型的浪潮中,无代码开发已成为企业提升效率、减少成本的新引擎。这种开发方式允许非技术人员通过图形界面构建应用程序,无需编写代码即可实现复杂功能。这对于营销、广告推广以及用户运营等业务尤为重要&a…...
win10下安装 Anaconda + Cuda + Cudnn + Pycharm + Pytorch
1.安装Anaconda (1-1)下载Ananconda, Anaconda官网 选择windows版本; (1-2)安装Anaconda,一般选择【Just Me】 (1-3)建议不要装在C盘,后期多环境的python环境和各种库文件会占用很多…...
第20章 多线程
创建线程 继承Thread 类 Thread 类时 java.lang 包中的一个类,从类中实例化的对象代表线程,程序员启动一个新线程需要建立 Thread 实例。 Thread 对象需要一个任务来执行,任务是指线程在启动时执行的工作,start() 方法启动线程&am…...
自定义类型:结构体,枚举,联合
1结构体的声明 1.1结构体基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2声明: struct tag {member-list; }variable-list; 描述一个学生: struct Stu {char name[20];//名字int age;//年龄char…...
C++:C++11新特性---右值引用
文章目录 初始化方式显示查看类型initializer_listdecltype左值引用和右值引用move左右值引用的场景 万能引用和完美转发 本篇总结C11新特性 初始化方式 C11对参数列表的初始化有了更明确的定义,可以这样进行定义 // 列表初始化 void test1() {// 旧版本int x 0…...
计算机人机界面
人机界面是指入与机器之间相互交流和影响的区域。人机界面包括对数据和信息的输入和输出方法,以及人们对机器的操作和控制。早期,人机交互界面是控制合,随后通过键盘进行操作,目前为鼠标和键盘操作,而智能手机采用触摸…...
【BUG合集】(一)①数据库存1/0,请求结果返回true和false;②sql查数据库能查,但mybatis查为空;③data64图片存储为异常;
前言 最近,在工作上接手的任务中,各种 bug 问题出现,在解决的同时也可以记录一下。因此,觉得可以出个记录 bug 合集。方便后来者碰到类似情况,可以作为一个参考进行解决。 文章题目就包含当前文章内容中所遇到的三个 b…...
python基础练习题库实验7
文章目录 题目1代码实验结果题目2代码实验结果题目3代码实验结果题目总结题目1 编写代码创建一个名为Staff的类和方法__init__,以按顺序初始化以下实例属性: -staff_number -first_name -last_name -email 代码 class Staff:def __init__(self, staff_number, first_name,…...
C语言你爱我么?(ZZULIOJ 1205:你爱我么?)
题目描述 LCY买个n束花准备送给她暗恋的女生,但是他不知道这个女生是否喜欢他。这时候一个算命先生告诉他让他查花瓣数,第一个花瓣表示"爱",第二个花瓣表示"不爱",第三个花瓣表示"爱"..... 为了使最…...
动手学深度学习(三)---Softmax回归
文章目录 一、理论知识1.图像分类数据集2.softmax回归的从零开始实现3.Softmax简洁实现 【相关总结】torch.sum()torch.argmax()isinstance():[python] softmax回归 一、理论知识 回归估计一个连续值分类预测一个离散类别 回归单连续数值输出自然区间R跟真实值的区别作为损失 …...
爬虫代理技术与构建本地代理池的实践
爬虫中代理的使用: 什么是代理 代理服务器 代理服务器的作用 就是用来转发请求和响应 在爬虫中为何需要使用代理? 隐藏真实IP地址:当进行爬取时,爬虫程序会发送大量的请求到目标网站。如果每个请求都使用相同的IP地址ÿ…...
token认证机制,基于JWT的Token认证机制实现,安全性的问题
文章目录 token认证机制几种常用的认证机制HTTP Basic AuthOAuthCookie AuthToken AuthToken Auth的优点 基于JWT的Token认证机制实现JWT的组成认证过程登录请求认证 对Token认证的五点认识JWT的JAVA实现 基于JWT的Token认证的安全问题确保验证过程的安全性如何防范XSS Attacks…...
什么是计算机病毒?
计算机病毒 1. 定义2. 计算机病毒的特点3. 计算机病毒的常见类型和攻击方式4. 如何防御计算机病毒 1. 定义 计算机病毒是计算机程序编制者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或程序代码。因其特点与生…...
【C++】哈希(位图、布隆过滤器)
一、哈希的应用(位图和布隆过滤器) 1、位图(bitset) (1)位图概念 【题目】 给 40亿 个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这 40亿 个数中。…...
LeetCode198.打家劫舍
打家劫舍和背包问题一样是一道非常经典的动态规划问题,只要做过几道动态规划的题,这道题简直就非常容易做出来。我应该花了10来分钟左右就写出来了,动态规划问题最重要的就是建立状态转移方程,就是说如何从上一个状态转移到下一个…...
Appium PO模式UI自动化测试框架——设计与实践
1. 目的 相信做过测试的同学都听说过自动化测试,而UI自动化无论何时对测试来说都是比较吸引人的存在。相较于接口自动化来说,它可以最大程度的模拟真实用户的日常操作与特定业务场景的模拟,那么存在即合理,自动化UI测试自然也是广…...
使用VUE3实现简单颜色盘,吸管组件,useEyeDropper和<input type=“color“ />的使用
1.使用vueuse中的useEyeDropper来实现滴管的功能和使用input中的type"color"属性来实现颜色盘 效果: 图标触发吸管 input触发颜色盘 组件代码部分 :<dropper> ---- vueuse使用 <template><div class"sRGBHexWrap fbc…...
matlab提取特征(医学图像)
乳腺肿瘤图片提取特征: %形态特征 %周长 面积 周长面积比 高度 宽度 纵横比 圆度 矩形度 伸长度 拟合椭圆长轴长 拟合椭圆短轴长 %拟合椭圆长轴与皮肤所夹锐角 最小外接凸多边形面积 最小外接凸多边形面积与肿瘤区面积比 %小叶树 叶指数 %纹理特征 %方差 熵 最小边差异 四个方…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...
Java中HashMap底层原理深度解析:从数据结构到红黑树优化
一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...
Java中栈的多种实现类详解
Java中栈的多种实现类详解:Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...
