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

news2025/6/4 0:55:29

在这里插入图片描述

2025 A卷 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 defaultdict

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

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

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

相关文章

苹果公司计划按年份来重命名重大的软件,将升级iOS 18软件至iOS 26

苹果公司计划从今年开始&#xff0c;所有苹果操作系统将统一采用年份标识&#xff0c;而非此前混乱的版本号体系。苹果将在6月9日的全球开发者大会上正式宣布这一变革。周三截至发稿&#xff0c;苹果股价震荡微涨0.46%&#xff0c;重回3万亿美元市值。 苹果公司正在筹划其操作…

园区智能化集成平台汇报方案

该方案为园区智能化集成平台设计,依据《智能建筑设计标准》等 20 余项国家与行业规范,针对传统园区信息孤岛、反应滞后、经验流失、管理粗放等痛点,构建可视化智慧园区管理平台,实现大屏数据可视化、三维设备监控、智慧运维(含工单管理、巡检打卡)、能源能耗分析、AI 安防…

奥威BI+AI——高效智能数据分析工具,引领数据分析新时代

随着数据量的激增&#xff0c;企业对高效、智能的数据分析工具——奥威BIAI的需求日益迫切。奥威BIAI&#xff0c;作为一款颠覆性的数据分析工具&#xff0c;凭借其独特功能&#xff0c;正在引领数据分析领域的新纪元。 一、‌零报表环境下的极致体验‌ 奥威BIAI突破传统报表限…

STM32F407VET6学习笔记8:UART5串口接收中断的Cubemx配置

之前的工程对串口的配置没有完善串口接受中断&#xff0c;这里补充配置UART5串口接收中断&#xff0c;实现串口回送功能 之前的文章&#xff1a; STM32F407VET6学习笔记5&#xff1a;STM32CubeMX配置串口工程_HAL库-CSDN博客 目录 中断配置&#xff1a; 中断服务函数&#xff1…

UE5.5 pixelstreaming插件打包报错

文章目录 错误内容如下解决方案推流服务器不能使用 错误内容如下 The following files are set to be staged, but contain restricted folder names ("Linux"): CTZ5_5/Samples/PixelStreaming/WebServers/Extras/FrontendTests/dockerfiles/linux/Dockerfile CTZ5…

设计模式——简单工厂模式(创建型)

摘要 本文主要介绍了简单工厂模式&#xff0c;包括其定义、结构、实现方式、适用场景、实战示例以及思考。简单工厂模式是一种创建型设计模式&#xff0c;通过工厂类根据参数决定创建哪一种产品类的实例&#xff0c;封装了对象创建的细节&#xff0c;使客户端无需关心具体类的…

qt ubuntu 20.04 交叉编译

一、交叉编译环境搭建 1.下载交叉编译工具链&#xff1a;https://developer.arm.com/downloads/-/gnu-a 可以根据自己需要下载对应版本&#xff0c;当前最新版本是10.3, 笔者使用10.3编译后的glibc.so版本太高&#xff08;glibc_2.3.3, glibc_2.3.4, glibc_2.3.5&#xff09;…

晶振频率稳定性:5G 基站与航天设备的核心竞争力

在当今科技飞速发展的时代&#xff0c;电子设备的性能和可靠性至关重要。晶振作为电子设备中的核心部件&#xff0c;为系统提供精确的时间和频率基准。晶振的频率稳定性直接影响着设备的整体性能&#xff0c;从日常生活中广泛使用的智能手机、智能穿戴设备&#xff0c;到对精度…

基于python脚本进行Maxwell自动化仿真

本文为博主进行Maxwell自动化研究过程的学习记录&#xff0c;同时对Maxwell自动化脚本&#xff08;pythonIron&#xff09;实现方法进行分享。 文章目录 脚本使用方法脚本录制与查看常用脚本代码通用开头定义项目调整设计变量软件内对应位置脚本 设置求解器软件内对应位置脚本…

Blueprints - List View Widget

一些学习笔记归档&#xff1b; 需要读取动态数据把多个条目显示在UI上的时候&#xff0c;可能用到List View组件&#xff1b;假如有Widget要使用在List View中&#xff0c;此Widget需要继承相关接口&#xff1a; 这样就能在List View控件中选择已经继承接口的Widget组件了&…

docker-compose搭建prometheus以及grafana

1. 什么是 Prometheus&#xff1f; Prometheus 是一个开源的系统监控和告警工具&#xff0c;由 SoundCloud 于 2012 年开始开发&#xff0c;现为 CNCF&#xff08;Cloud Native Computing Foundation&#xff09;项目之一。它特别适合云原生环境和容器编排系统&#xff08;如 …

多线程和并发之线程

线程 前面讲到进程&#xff1a;为了并发执行任务&#xff08;程序&#xff09;&#xff0c;现代操作系统才引进进程的概念 分析&#xff1a; 创建开销问题&#xff1a;创建一个进程开销&#xff1a;大 子进程需要拷贝父进程的整个地址空间 通信开销问题&#xff1a;进程间的通…

apptrace 的优势以及对 App 的价值

官网地址&#xff1a;AppTrace - 专业的移动应用推广追踪平台 apptrace 的优势以及对 App 的价值​ App 拉起作为移动端深度链接技术的关键应用&#xff0c;能实现从 H5 网页到 App 的无缝跳转&#xff0c;并精准定位到 App 内指定页面。apptrace 凭借专业的技术与丰富的经验…

android studio debug调试出现 IOException异常

解决Android调试端口无法打开的问题&#xff0c;出现"Unable to open debugger port"错误时&#xff0c;可以进入app设置&#xff0c;选择Debugger选项&#xff0c;将Debug type更改为Java Only模式。这个方法适用于Android Studio调试时遇到的端口连接问题&#xff…

vr中风--数据处理模型搭建与训练

# -*- coding: utf-8 -*- """ MUSED-I康复评估系统&#xff08;增强版&#xff09; 包含&#xff1a;多通道sEMG数据增强、混合模型架构、标准化处理 """ import numpy as np import pandas as pd from sklearn.model_selection import train_te…

前端学习(7)—— HTML + CSS实现博客系统页面

目录 一&#xff0c;效果展示 二&#xff0c;实现博客列表页 2.1 实现导航栏 2.2 实现个人信息 2.3 实现博客列表 三&#xff0c;实现博客正文页 3.2 复用 3.4 实现博客正文 四&#xff0c;实现博客登录页 4.1 版心 4.2 登录框 五&#xff0c;实现博客编辑页 5.1 …

RuoYi前后端分离框架实现前后端数据传输加密(二)之前端篇

一、背景 本文是RuoYi前后端分离框架实现前后端数据传输加密(一)之后端篇文章配套的,主要介绍前端对自定义字段传输加密的实现,两篇文章结合可以完整的完成RuoYi前后端分离框架对API通信过程中实现自定义字段加密传输。前端的加解密实现,不涉及到界面的修改,仅仅是方法的…

基于视觉的车道线检测完整代码:让驾驶更安全的开源解决方案

基于视觉的车道线检测完整代码&#xff1a;让驾驶更安全的开源解决方案 【下载地址】基于视觉的车道线检测完整代码 这是一个基于视觉的车道线检测开源项目&#xff0c;提供完整的代码示例&#xff0c;采用滑动窗口算法实现。项目通过逐行扫描图像&#xff0c;精准识别曲线车道…

鸿蒙仓颉开发语言实战教程:自定义tabbar

大家周末好呀&#xff0c;今天继续分享仓颉语言开发商城应用的实战教程&#xff0c;今天要做的是tabbar。 大家都知道ArkTs有Tabs和TabContent容器&#xff0c;能够实现上图的样式&#xff0c;满足基本的使用需求。而仓颉就不同了&#xff0c;它虽然也有这两个组件&#xff0c;…

28 C 语言作用域详解:作用域特性(全局、局部、块级)、应用场景、注意事项

1 作用域简介 作用域定义了代码中标识符&#xff08;如变量、常量、数组、函数等&#xff09;的可见性与可访问范围&#xff0c;即标识符在程序的哪些位置能够被引用或访问。在 C 语言中&#xff0c;作用域主要分为三类&#xff1a; 全局作用域局部作用域块级作用域 需注意&am…