华为OD机试真题——最小矩阵宽度(宽度最小的子矩阵)(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

article/2025/6/17 6:00:17

在这里插入图片描述

2025 B卷 200分 题型

本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》

华为OD机试真题《最小矩阵宽度(宽度最小的子矩阵)》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C

GO


题目名称:最小矩阵宽度(宽度最小的子矩阵)


  • 知识点:滑动窗口、哈希表(计数覆盖)
  • 时间限制:1秒
  • 空间限制:256MB
  • 限定语言:不限

题目描述

给定一个矩阵,包含 N * M 个整数,和一个包含 K 个整数的数组。现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数(包括重复数字)。

输入描述

  1. 第一行输入两个正整数 N, M,表示矩阵大小。
  2. 接下来 N 行,每行 M 个整数,表示矩阵内容。
  3. 下一行包含一个正整数 K
  4. 下一行包含 K 个整数,表示需要包含的数组,可能存在重复数字。
    所有输入数据小于 1000

输出描述
输出一个整数,表示满足要求的子矩阵的最小宽度(连续列数)。若找不到,输出 -1

示例 1
输入:

2 5  
1 2 2 3 1  
2 3 2 3 2  
3  
1 2 3  

输出:

2  

说明:矩阵第0、3列包含 1, 2, 3,第3、4列也包含 1, 2, 3,最小宽度为2。

示例 2
输入:

2 5  
1 2 2 3 1  
1 3 2 3 4  
3  
1 1 4  

输出:

5  

说明:只有所有列才能覆盖 1, 1, 4,宽度为5。


Java

问题分析

我们需要在矩阵中找到包含所有目标元素的最窄连续列区间。子矩阵必须包含目标数组中的所有元素,包括重复元素,并且宽度(列数)最小。

解题思路

  1. 预处理目标数组:统计每个元素的出现次数。
  2. 预处理矩阵列:统计每列中元素的出现次数。
  3. 遍历所有可能的窗口宽度:从1到M,检查每个宽度的所有连续列区间是否满足目标频率要求,找到最小的宽度。

代码实现

import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int N = scanner.nextInt();int M = scanner.nextInt();int[][] matrix = new int[N][M];// 读取矩阵for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {matrix[i][j] = scanner.nextInt();}}// 读取目标数组int K = scanner.nextInt();int[] target = new int[K];for (int i = 0; i < K; i++) {target[i] = scanner.nextInt();}// 预处理:统计目标数组中每个元素出现的次数Map<Integer, Integer> targetFreq = new HashMap<>();for (int num : target) {targetFreq.put(num, targetFreq.getOrDefault(num, 0) + 1);}// 预处理:统计每列的元素频率List<Map<Integer, Integer>> columns = new ArrayList<>();for (int col = 0; col < M; col++) {Map<Integer, Integer> freq = new HashMap<>();for (int row = 0; row < N; row++) {int num = matrix[row][col];freq.put(num, freq.getOrDefault(num, 0) + 1);}columns.add(freq);}// 遍历所有可能的窗口宽度for (int width = 1; width <= M; width++) {for (int start = 0; start <= M - width; start++) {Map<Integer, Integer> sum = new HashMap<>();// 累加当前窗口内的所有列for (int col = start; col < start + width; col++) {Map<Integer, Integer> colFreq = columns.get(col);for (Map.Entry<Integer, Integer> entry : colFreq.entrySet()) {int num = entry.getKey();sum.put(num, sum.getOrDefault(num, 0) + entry.getValue());}}// 检查是否满足目标频率boolean valid = true;for (Map.Entry<Integer, Integer> entry : targetFreq.entrySet()) {if (sum.getOrDefault(entry.getKey(), 0) < entry.getValue()) {valid = false;break;}}if (valid) {System.out.println(width);return;}}}System.out.println(-1);}
}

代码详细解析

  1. 读取输入:读取矩阵大小、矩阵内容、目标数组。
  2. 统计目标频率:使用HashMap记录目标数组中每个元素的出现次数。
  3. 预处理列频率:对每一列统计各元素的出现次数,存储在columns列表中。
  4. 遍历窗口宽度:从1到M,检查每个可能的连续列区间。
  5. 累加列频率:对当前窗口内的所有列,累加各元素的出现次数到sum
  6. 验证频率:检查累加后的频率是否满足目标要求,若满足则立即输出当前宽度。

示例测试

示例1
输入:

2 5
1 2 2 3 1
2 3 2 3 2
3
1 2 3

输出:

2

示例2
输入:

2 5
1 2 2 3 1
1 3 2 3 4
3
1 1 4

输出:

5

综合分析

  • 时间复杂度:O(M² * K),M为矩阵列数,K为每列平均元素数。在题目限制下可行。
  • 空间复杂度:O(M * K),存储每列的元素频率。
  • 正确性:遍历所有可能的窗口,确保找到最小宽度。
  • 适用性:简单直观,适用于输入规模较小的情况。

python

问题分析

我们需要在矩阵中找到包含所有目标元素的最窄连续列区间。子矩阵必须包含目标数组中的所有元素,包括重复次数,并且宽度(列数)最小。


解题思路

  1. 预处理目标数组:统计每个元素的出现次数。
  2. 预处理矩阵列:统计每列中元素的出现次数。
  3. 遍历所有可能的窗口宽度:从1到M,检查每个宽度的所有连续列区间是否满足目标频率要求,找到最小的宽度。

代码实现

from collections import defaultdictdef main():# 读取输入n, m = map(int, input().split())matrix = []for _ in range(n

http://www.hkcw.cn/article/KyDUtVBjPM.shtml

相关文章

钟楚曦秀手臂肌肉线条 海边锻炼展现强健体魄

6月3日,演员钟楚曦在个人社交平台分享了一组近照,并配文:“只能就地拿两瓶海水练练了”。照片中,她穿着礼服裙在海边展示肌肉好身材,令人赞叹。照片里的钟楚曦妆发精致,扎着丸子头,化着红唇美妆,身穿吊带超短裙,身材火辣苗条。尽管造型绝美,她却双手拿着两个装满海水…

官方通报女子打砸多辆汽车 事件视频引发关注

今天(3日),一段视频引起了广泛关注。视频中,一名女子手持铁棍无差别攻击过往车辆,并多次跳上车顶打砸。河南省洛阳市伊川县人民政府城关街道办事处在今天下午发布了情况通报。责任编辑:0882

郑钦文法网女单8强发球质量位居第一 鏖战虽败犹荣

在6月3日进行的2025年法国网球公开赛女单四分之一决赛中,赛会8号种子、中国选手郑钦文以6:7(3)、3:6不敌现世界排名第一的白俄罗斯选手萨巴伦卡,止步八强。比赛首盘即陷入鏖战,时长超过一个小时。郑钦文开局手感火热,在第3局成功破发,一度取得3:1的领先优势。但在随后的几…

赶考出行这些事项要留意 关注天气平安迎考

距离2025年高考还有4天,这个时期全国大部分地区雨水充沛,加上六月初天气炎热,容易形成局部暴雨。每年高考期间,部分地区会出现不同程度的降雨。考生和家长需及时关注天气预报,提前规划赴考路线,注意防暑降温,并确保出行安全。祝所有考生平安迎考,金榜题名。责任编辑:0…

缅甸发生4.1级地震 震源深度10千米

中国地震台网正式测定:6月3日21时28分在缅甸(北纬21.23度,东经99.54度)发生4.1级地震,震源深度10千米。(总台央视记者 张腾飞)责任编辑:0882

追火箭上火星 科技旅游火出圈 科技创新激发文旅活力

近年来,我国科技事业取得历史性成就,载人航天、深空探测、“人造太阳”等科技成果捷报频传,进一步激发了全社会对科技创新的关注。新奇有趣的科技旅游成为越来越多群众的选择。各地不断探索优化硬件和完善服务,以吸引更多游客。海南文昌的瑶光火箭观礼平台是当地首个航天观…

杜海涛:跟歌手女主持约会的一天 甜蜜互动引关注

2025年6月3日,杜海涛在微博上分享了与妻子沈梦辰的日常互动,标题为“跟歌手女主持约会的一天”,展现了两人温馨而甜蜜的生活。尽管标题未直接提及沈梦辰的名字,但从后续内容中可以确认这位“女主持”正是沈梦辰。杜海涛因急性扁桃体发炎身体不适,沈梦辰连夜从长沙飞往北京…

37岁包文婧感叹产后减肥不易 二胎满月喜上加喜

6月1日,包文婧在社交账号上分享了庆祝二胎满月的视频,宣布她终于结束了坐月子的生活。37岁的包文婧选择了一个较短的28天坐月子期,产后状态非常好。刚出月子,包文婧就化了漂亮的妆容,显得非常高兴。她穿着坐月子的衣服出现,透露自己产前体重为134斤,出月子时减到了110斤…

韩国改革新党候选人李俊锡宣布败选 得票率7.7%位列第三

韩国改革新党候选人李俊锡于6月3日晚宣布败选。当天,韩国举行了第21届总统选举。根据韩国三大电视台在投票结束后公布的联合出口民调,共同民主党总统候选人李在明以51.7%的得票率领先,国民力量党候选人金文洙以39.3%的得票率紧随其后,而李俊锡仅获得7.7%的选票。责任编辑:…

评论员:韩国选民拒为亲美政客买账 金文洙大选败局已定

在韩国大选进入关键阶段之际,国民力量党候选人金文洙前往仁川自由公园举行集会拉票。他在麦克阿瑟铜像前默哀,并带领工作人员集体下跪,向参加集会的民众求支持。这一举动不仅暴露了他的亲美立场,还展示了其高超的表演技巧。然而,这些表演并未赢得大多数选民的支持。金文洙…

乐基儿二度离婚后首谈黎明:没联系了 满脸笑容送祝福

近日,44岁的模特乐基儿在二度离婚后首次公开谈论前夫黎明。她在采访中表示两人已无联系,并笑着祝福黎明演唱会成功。2000年,黎明和乐基儿初次相识;2008年3月13日,他们在马尔代夫举行婚礼;2012年10月3日,黎明通过其公司宣布与乐基儿离婚。2023年9月10日,乐基儿向媒体证实…

乌偷袭俄成功带来哪些深远影响 无人机改变战争规则

一架藏在卡车木质顶棚下的FPV无人机突然激活,引擎的嗡鸣撕裂了西伯利亚军事基地的寂静。它冲向停机坪上庞大的图-95战略轰炸机,火光瞬间吞没了这架曾威慑欧洲的“空中巨兽”。2025年6月1日深夜,俄罗斯五个州同时上演了类似的场景。乌克兰国家安全局将这场代号“蛛网”的行动…

荷兰首相宣布辞职 内阁将解散 看守政府继续运作

荷兰首相斯霍夫于6月3日宣布,将向国王威廉-亚历山大递交内阁辞呈,政府内阁将解散。斯霍夫表示,内阁将继续作为看守政府,并致力于解决与安全相关的问题。同日,荷兰自由党领导人维尔德斯宣布退出联合政府。责任编辑:0764

华为OD机试真题——模拟工作队列(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

白俄罗斯总统抵达北京释放何信号 特朗普急了

白俄罗斯总统卢卡申科宣布访华三天,这一消息引发了国际关注。与此同时,白宫主动放出风声,称中美会谈即将举行,这释放了何种信号?白俄罗斯总统专机抵达北京之际,美国似乎被冷落。自五月底以来,关于特朗普希望与中方会面的消息不断传出。特朗普曾表示确信会与中方通话,但…

山西一小区地下水“高烧”到72摄氏度 地热原因成谜

近日,山西长治锦绣司马小区的居民反映,小区内一些业主地下室温度高达40摄氏度,附近抽出来的地下水温度更是达到72摄氏度。多个部门前来调查,但未能找到地热原因。视频显示,小区外面绿化带已被挖开,几根黑色粗管堆放在一起,一根细管从绿化带位置延伸到下水井,管中不断有…

83岁李明博高调亮相为金文洙打气 前总统力挺候选人

在韩国国内提前投票的第一天,73岁的前总统朴槿惠和74岁的文在寅分别前往居住地的投票站,投下了他们的一票。朴槿惠支持的是金文洙,而文在寅则选择了李在明。前总理韩德洙也提前为金文洙投票。朴槿惠曾被大法院终审判处22年有期徒刑,公民政治权利自动被剥夺。但在2021年底,…

华为OD机试真题——最小的调整次数/特异性双端队列(2025B卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 B卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《最小的调整次数/特异性双端…

华为OD机试真题——模拟消息队列(2025B卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 B卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《模拟消息队列》: 目录 题…

自称有两栋楼征婚者回应质疑 非炒作求偶遇

在广州天河猎德村举行的龙舟招景盛会上,一名脖子上挂着“两栋楼,海珠,未婚”牌子的男子引起了网络关注。这名林姓男子是广州海珠区仑头人,1990年出生,身高超过1米7,已经单身三年。林先生表示,他并非想炒作当网红,而是希望通过网络征婚找到合适的另一半。他解释说,在盛…