2022-09-25:给定一个二维数组matrix,数组中的每个元素代表一棵树的高度。 你可以选定连续的若干行组成防风带,防风带每一列的防风高度为这一列的最大值 防风带整体的防风高度为,所有列防风高度
2022-09-25:给定一个二维数组matrix,数组中的每个元素代表一棵树的高度。
你可以选定连续的若干行组成防风带,防风带每一列的防风高度为这一列的最大值
防风带整体的防风高度为,所有列防风高度的最小值。
比如,假设选定如下三行
1 5 4
7 2 6
2 3 4
1、7、2的列,防风高度为7
5、2、3的列,防风高度为5
4、6、4的列,防风高度为6
防风带整体的防风高度为5,是7、5、6中的最小值
给定一个正数k,k <= matrix的行数,表示可以取连续的k行,这k行一起防风。
求防风带整体的防风高度最大值。
答案2022-09-25:
窗口内最大值和最小值问题。
代码用rust编写。代码如下:
use rand::Rng;
use std::iter::repeat;
fn main() {
let n_max = 10;
let m_max = 10;
let v_max = 50;
let test_time = 1000;
println!("测试开始");
for _ in 0..test_time {
let n = rand::thread_rng().gen_range(0, n_max) + 1;
let m = rand::thread_rng().gen_range(0, m_max) + 1;
let mut matrix = generate_matrix(n, m, v_max);
let k = rand::thread_rng().gen_range(0, n) + 1;
let ans1 = best_height1(&mut matrix, k);
let ans2 = best_height2(&mut matrix, k);
if ans1 != ans2 {
println!("出错了");
break;
}
}
println!("测试结束");
}
const MAX_VALUE: i32 = 1 << 31 - 1;
fn best_height1(matrix: &mut Vec<Vec<i32>>, k: i32) -> i32 {
let n = matrix.len() as i32;
let m = matrix[0].len() as i32;
let mut ans = 0;
for start_row in 0..n {
let mut bottle_neck = MAX_VALUE;
for col in 0..m {
let mut height = 0;
let mut end_row = start_row;
while end_row < n && (end_row - start_row + 1 <= k) {
height = get_max(height, matrix[end_row as usize][col as usize]);
end_row += 1;
}
bottle_neck = get_min(bottle_neck, height);
}
ans = get_max(ans, bottle_neck);
}
return ans;
}
fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a > b {
a
} else {
b
}
}
fn get_min<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a < b {
a
} else {
b
}
}
fn best_height2(matrix: &mut Vec<Vec<i32>>, k: i32) -> i32 {
let n = matrix.len() as i32;
let m = matrix[0].len() as i32;
let mut window_maxs: Vec<Vec<i32>> = repeat(repeat(0).take(n as usize).collect())
.take(m as usize)
.collect();
let mut window_l_r: Vec<Vec<i32>> = repeat(repeat(0).take(2).collect())
.take(m as usize)
.collect();
for i in 0..k {
add_row(matrix, m, i, &mut window_maxs, &mut window_l_r);
}
let mut ans = bottle_neck(matrix, m, &mut window_maxs, &mut window_l_r);
for i in k..n {
add_row(matrix, m, i, &mut window_maxs, &mut window_l_r);
delete_row(m, i - k, &mut window_maxs, &mut window_l_r);
ans = get_max(
ans,
bottle_neck(matrix, m, &mut window_maxs, &mut window_l_r),
);
}
return ans;
}
fn add_row(
matrix: &mut Vec<Vec<i32>>,
m: i32,
row: i32,
window_maxs: &mut Vec<Vec<i32>>,
window_l_r: &mut Vec<Vec<i32>>,
) {
for col in 0..m {
while window_l_r[col as usize][0] != window_l_r[col as usize][1]
&& matrix
[window_maxs[col as usize][(window_l_r[col as usize][1] - 1) as usize] as usize]
[col as usize]
<= matrix[row as usize][col as usize]
{
window_l_r[col as usize][1] -= 1;
}
window_maxs[col as usize][window_l_r[col as usize][1] as usize] = row;
window_l_r[col as usize][1] += 1;
}
}
fn delete_row(m: i32, row: i32, window_maxs: &mut Vec<Vec<i32>>, window_l_r: &mut Vec<Vec<i32>>) {
for col in 0..m {
if window_maxs[col as usize][window_l_r[col as usize][0] as usize] == row {
window_l_r[col as usize][0] += 1;
}
}
}
fn bottle_neck(
matrix: &mut Vec<Vec<i32>>,
m: i32,
window_maxs: &mut Vec<Vec<i32>>,
window_l_r: &mut Vec<Vec<i32>>,
) -> i32 {
let mut ans = MAX_VALUE;
for col in 0..m {
ans = get_min(
ans,
matrix[window_maxs[col as usize][window_l_r[col as usize][0] as usize] as usize]
[col as usize],
);
}
return ans;
}
fn generate_matrix(n: i32, m: i32, v: i32) -> Vec<Vec<i32>> {
let mut matrix: Vec<Vec<i32>> = repeat(repeat(0 as i32).take(m as usize).collect())
.take(n as usize)
.collect();
for i in 0..n {
for j in 0..m {
matrix[i as usize][j as usize] = rand::thread_rng().gen_range(0, v) + 1;
}
}
return matrix;
}
执行结果如下:

2022-09-25:给定一个二维数组matrix,数组中的每个元素代表一棵树的高度。 你可以选定连续的若干行组成防风带,防风带每一列的防风高度为这一列的最大值 防风带整体的防风高度为,所有列防风高度的更多相关文章
- ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)
1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 112[ ...
- c语言题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点
//题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小.也可能没有鞍点. // #include "stdio.h" #include <stdli ...
- [CareerCup] 13.10 Allocate a 2D Array 分配一个二维数组
13.10 Write a function in C called my2DAlloc which allocates a two-dimensional array. Minimize the n ...
- 如何用一个for循环打印出一个二维数组
思路分析: 二维数组在内存中默认是按照行存储的,比如一个二维数组{{1,2,3,},{4,5,6}},它在内存中存储的顺序就是1.2.3.4.5.6,也就是说,对于这6个数组元素,按照从0到5给它们编 ...
- C语言程序,找出一个二维数组的鞍点。
什么是鞍点????? 鞍点就是在一个二维数组中,某一个数在该行中最大,然而其在该列中又是最小的数,这样的数称为鞍点. 昨天突然在书上看到这样的一道题,就自己尝试着写了一个找出一个二维数组中的鞍点. 好 ...
- C#编写程序,找一找一个二维数组中的鞍点
编写程序,找一找一个二维数组中的鞍点(即该位置上的元素值在行中最大,在该列上最小.有可能数组没有鞍点).要求: 1.二维数组的大小.数组元素的值在运行时输入: 2.程序有友好的提示信息. 代码: us ...
- 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。
//在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’:输出这个数组中的所有元素. char [][]y=new char [10][10 ...
- new一个二维数组
.定义一个二维数组 char **array1 array1 = new char *[x]; for(i=0;i<x;++i) array1[i] = new char[y]; ...用的时候 ...
- poj2155一个二维树状数组
...
- php中向前台js中传送一个二维数组
在php中向前台js中传送一个二维数组,并在前台js接收获取其中值的全过程方法: (1),方法说明:现在后台将数组发送到前台 echo json_encode($result); 然后再在js页面中的 ...
随机推荐
- sqlserver 生成随机值
随机生成100以内的整数 select top 10 number,ceiling(rand(checksum(newid()))*100) from master.dbo.spt_valueswhe ...
- Unity2017-HTC项目串流Pico摇杆移动功能
最近公司PC项目需要串流到Piconec3上运行,HTC手柄是圆盘键按下移动还可以,但是Piconeo3是摇杆,按下移动的话显得不科学,所以写了一套基于圆盘键,使用摇杆移动的方法 第一步:编写摇杆左右 ...
- vsftpd配置FTP服务器(Centos7.x安装)
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | grep vsftpdvsftpd-2.2.2-24.el6.x86_64 如果有展示则已经安装,不需要重新安装 ...
- 文件的上传&预览&下载学习(一)
注:主要是说明后端逻辑和数据库表设计 1.当前主流的几种文件上传&预览&下载方式 把文件直接存储在服务器 分布式存储OSS,比如阿里OSS.Minio 2.数据库表设计 由于文件都是跟 ...
- Python 爬虫入门(一)环境搭建
一.梳理图 Python是个啥.为啥学习.作用域,随便查一下什么信息都有 本人目前是Java开发,在学习爬虫时发现在爬虫方面,Python比Java简单.方便.实用很多,不是不能做,只是单纯的适合 在 ...
- RHEL系列邮箱配置mail.rc和s-nail.rc
RHEL8 1.首先安装postfix和mailx dnf install postfix mailx -y 2.开启postfix服务开机运行 systemctl enable --now post ...
- 实践解析丨如何通过 WebAssembly 在 Web 进行实时视频人像分割
5 月 15 日,声网Agora 高级架构师高纯参加了 WebAssambly 社区举办的第一场线下活动"WebAssembly Meetup",并围绕声网Agora 在 Web ...
- Cisco模拟器配置DNS服务器遇到的问题
1.使用工具: Cisco-Packet-Tracer(7.0或8.0版本及以上) 2.问题: 原因:安装思科模拟器后进行中文汉化: 过程:配置DNS服务时无法进行域名操作: 解决: 更改为原来的语言 ...
- 面向Web开发人员的Linux实用入门
从 web 开发的视角说一下在使用 Linux 时遇到的问题,主要是针对操作本身,因为指令在网上都可以查到,不会深入原理,但尽量实用. 基础认知 为什么使用 Linux 最初我使用 Linux 是因为 ...
- 关于关键字extends与implements的不同以及关于接口的详细介绍的文章
extends与implements的不同 1.在类的声明中,通过关键字extends来创建一个类的子类. 一个类通过关键字implements声明自己使用一个或者多个接口. extends 是继承某 ...