Rust每日一练(Leetday0029) 柱状图、最大矩形、扰乱字符串

news2025/4/19 19:12:53

目录

84. 柱状图中最大的矩形 Largest-rectangle-in-histogram  🌟🌟🌟

85. 最大矩形 Maximal Rectangle  🌟🌟🌟

87. 扰乱字符串 Scramble String  🌟🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


84. 柱状图中最大的矩形 Largest-rectangle-in-histogram

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1:

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

示例 2:

输入: heights = [2,4]
输出: 4

提示:

  • 1 <= heights.length <=10^5
  • 0 <= heights[i] <= 10^4 

代码1: 暴力枚举

fn largest_rectangle_area(heights: Vec<i32>) -> i32 {
    let n = heights.len();
    let mut max_area = 0;
    for i in 0..n {
        let mut left = i;
        let mut right = i;
        while left > 0 && heights[left - 1] >= heights[i] {
            left -= 1;
        }
        while right < n - 1 && heights[right + 1] >= heights[i] {
            right += 1;
        }
        let area = heights[i] * (right - left + 1) as i32;
        if area > max_area {
            max_area = area;
        }
    }
    max_area
}

fn main() {
    let heights = vec![2, 1, 5, 6, 2, 3];
    println!("{}", largest_rectangle_area(heights)); // 输出:10

    let heights = vec![2, 4];
    println!("{}", largest_rectangle_area(heights)); // 输出:4
}

代码2: 单调栈

fn largest_rectangle_area(heights: Vec<i32>) -> i32 {
    let n = heights.len();
    let mut stack = Vec::new();
    let mut max_area = 0;
    for i in 0..=n {
        let cur_height = if i == n { 0 } else { heights[i] };
        while !stack.is_empty() && cur_height < heights[*stack.last().unwrap()] {
            let h = heights[stack.pop().unwrap()];
            let w = if stack.is_empty() { i } else { i - stack.last().unwrap() - 1 };
            let area = h * w as i32;
            if area > max_area {
                max_area = area;
            }
        }
        stack.push(i);
    }
    max_area
}

fn main() {
    let heights = vec![2, 1, 5, 6, 2, 3];
    println!("{}", largest_rectangle_area(heights)); // 输出:10

    let heights = vec![2, 4];
    println!("{}", largest_rectangle_area(heights)); // 输出:4
}

输出:

10
4


85. 最大矩形 Maximal Rectangle

给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例 1:

输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:6
解释:最大矩形如上图所示。

示例 2:

输入:matrix = []
输出:0

示例 3:

输入:matrix = [["0"]]
输出:0

示例 4:

输入:matrix = [["1"]]
输出:1

示例 5:

输入:matrix = [["0","0"]]
输出:0

提示:

  • rows == matrix.length
  • cols == matrix[0].length
  • 1 <= row, cols <= 200
  • matrix[i][j] 为 '0' 或 '1'

 代码:

fn maximal_rectangle(matrix: Vec<Vec<char>>) -> i32 {
    let rows = matrix.len();
    if rows == 0 {
        return 0;
    }
    let cols = matrix[0].len();
    let mut heights = vec![0; cols];
    let mut max_area = 0;
    for i in 0..rows {
        for j in 0..cols {
            if matrix[i][j] == '1' {
                heights[j] += 1;
            } else {
                heights[j] = 0;
            }
        }
        let area = largest_rectangle_area(&heights);
        if area > max_area {
            max_area = area;
        }
    }
    max_area
}

fn largest_rectangle_area(heights: &Vec<i32>) -> i32 {
    let mut stack = Vec::new();
    let mut max_area = 0;
    let mut i = 0;
    while i <= heights.len() {
        let h = if i == heights.len() { 0 } else { heights[i] };
        while !stack.is_empty() && h < heights[*stack.last().unwrap()] {
            let height = heights[stack.pop().unwrap()];
            let width = if stack.is_empty() { i } else { i - stack.last().unwrap() - 1 };
            let area = height * width as i32;
            if area > max_area {
                max_area = area;
            }
        }
        stack.push(i);
        i += 1;
    }
    max_area
}

fn main() {
    let matrix = vec![
        vec!['1', '0', '1', '0', '0'],
        vec!['1', '0', '1', '1', '1'],
        vec!['1', '1', '1', '1', '1'],
        vec!['1', '0', '0', '1', '0']
    ];
    println!("{}", maximal_rectangle(matrix));
}

输出:

6


87. 扰乱字符串 Scramble String

使用下面描述的算法可以扰乱字符串 s 得到字符串 t :

  1. 如果字符串的长度为 1 ,算法停止
  2. 如果字符串的长度 > 1 ,执行下述步骤:
    • 在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串 s ,则可以将其分成两个子字符串 x 和 y ,且满足 s = x + y 。
    • 随机 决定是要「交换两个子字符串」还是要「保持这两个子字符串的顺序不变」。即,在执行这一步骤之后,s 可能是 s = x + y 或者 s = y + x 。
    • 在 x 和 y 这两个子字符串上继续从步骤 1 开始递归执行此算法。

给你两个 长度相等 的字符串 s1 和 s2,判断 s2 是否是 s1 的扰乱字符串。如果是,返回 true ;否则,返回 false 。

示例 1:

输入:s1 = "great", s2 = "rgeat"
输出:true
解释:s1 上可能发生的一种情形是:
"great" --> "gr/eat" // 在一个随机下标处分割得到两个子字符串
"gr/eat" --> "gr/eat" // 随机决定:「保持这两个子字符串的顺序不变」
"gr/eat" --> "g/r / e/at" // 在子字符串上递归执行此算法。两个子字符串分别在随机下标处进行一轮分割
"g/r / e/at" --> "r/g / e/at" // 随机决定:第一组「交换两个子字符串」,第二组「保持这两个子字符串的顺序不变」
"r/g / e/at" --> "r/g / e/ a/t" // 继续递归执行此算法,将 "at" 分割得到 "a/t"
"r/g / e/ a/t" --> "r/g / e/ a/t" // 随机决定:「保持这两个子字符串的顺序不变」
算法终止,结果字符串和 s2 相同,都是 "rgeat"
这是一种能够扰乱 s1 得到 s2 的情形,可以认为 s2 是 s1 的扰乱字符串,返回 true

示例 2:

输入:s1 = "abcde", s2 = "caebd"
输出:false

示例 3:

输入:s1 = "a", s2 = "a"
输出:true

提示:

  • s1.length == s2.length
  • 1 <= s1.length <= 30
  • s1 和 s2 由小写英文字母组成

代码:

fn is_scramble(s1: String, s2: String) -> bool {
    let s1 = s1.as_bytes();
    let s2 = s2.as_bytes();
    let n = s1.len();
    if s1 == s2 {
        return true;
    }
    if n != s2.len() {
        return false;
    }
    let mut dp = vec![vec![vec![false; n + 1]; n]; n];
    for i in 0..n {
        for j in 0..n {
            dp[i][j][1] = s1[i] == s2[j];
        }
    }
    for l in 2..=n {
        for i in 0..=n-l {
            for j in 0..=n-l {
                for k in 1..l {
                    if (dp[i][j][k] && dp[i+k][j+k][l-k]) || (dp[i][j+l-k][k] && dp[i+k][j][l-k]) {
                        dp[i][j][l] = true;
                        break;
                    }
                }
            }
        }
    }
    dp[0][0][n]
}

fn main() {
    let s1 = String::from("abcde");
    let s2 = String::from("caebd");
    println!("{}", is_scramble(s1, s2));
    let s1 = String::from("a");
    let s2 = String::from("a");
    println!("{}", is_scramble(s1, s2));
}

输出:

false
true


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

6.13 生日快乐

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

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

相关文章

WebTransport 开播的应用实践之路

动手点关注 干货不迷路 Web开播的业务挑战 无论是本地软件推流还是Web推流&#xff0c;都需要解决推流抖动、画面高糊、音频卡顿等问题。在现有的Web技术环境下&#xff0c;如何稳定地把高质量的音视频流呈现给更多用户&#xff0c;是我们技术团队攻克的重点。从技术角度来解读…

lua编程——air724二次开发之串口通信教程

有了上一章文章《lua编程——air724二次开发之点亮led教程》的基础&#xff0c;接下来将介绍如何使用lua语言进行串口通信。 一、硬件连接 根据银尔达硬件资料的介绍&#xff0c;如下图&#xff1a; 直接将usb转ttl工具和4G模块进行连接&#xff0c;接收和发送线需要交叉连接。…

【IMX6ULL驱动开发学习】07.cdev注册驱动设备_设置次设备号范围

一、register_chrdev 在之前的hello驱动中&#xff0c;注册驱动设备的方式如下 /*初始化设备方法1&#xff1a;自动分配设备号&#xff0c;占用所有次设备号*/ major register_chrdev(0,"hello_drv",&hello_fops);使用 register_chrdev 分配设备号的方式比较…

从玩具到工具|社畜程序员用AI提效的神仙操作

&#x1f449;腾小云导读 随着 AI 技术的日益发展&#xff0c;前端开发模式和提效工具也在不断地变化。作为一名前端工程师&#xff0c;如何应对 AI 带来的挑战和机遇&#xff1f;在这篇文章中&#xff0c;作者将介绍什么是 AIGC&#xff0c;并深入探讨 AI 在低代码平台的应用。…

【数据结构】顺序表及其实现

目录 1.线性表 2.顺序表 2.1顺序表的概念及结构 2.2顺序表的实现 1.线性表 线性表&#xff1a;是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表&#xff0c;链表&#xff0c;栈&#xff0c;队…

Parallels Desktop 18 18.3.1激活攻略

如果说虚拟机领域有一位王者&#xff0c;非Parallels不能领袖群伦&#xff0c;毕竟大厂背书&#xff0c;功能满格&#xff0c;美中不足之处就是价格略高&#xff0c;但这也并非是Parallels的错&#xff0c;因为市场上没有任何一款虚拟机产品在产品力层面能和Parallels抗衡&…

使用Typora+PicGo+阿里云搭建图床

1.为什么要使用图床 不知道大家有没有遇到过这样的问题&#xff1f; 在使用Typora的时候&#xff0c;我们传到typora上面的图片&#xff0c;在转到其他地方时&#xff0c;总是加载不出来&#xff0c;造成图片丢失现象或者是在将markdown笔记上传到博客时&#xff0c;总是需要一…

华为OD机试真题 JavaScript 实现【静态代码扫描服务】【2023Q1 100分】

一、题目描述 静态扫描快速识别源代码的缺陷&#xff0c;静态扫描的结果以扫描报告作为输出&#xff1a; 文件扫描的成本和文件大小相关&#xff0c;如果文件大小为N&#xff0c;则扫描成本为N个金币&#xff1b;扫描报告的缓存成本和文件大小无关&#xff0c;每缓存一个报告…

(二)安装 Kafka

文章目录 1.选择操作系统2.配置 Java 环境3.安装 ZooKeeper4.安装 broker&#xff08;1&#xff09;安装 broker&#xff08;2&#xff09;验证是否安装正确 5.配置 broker&#xff08;1&#xff09;常规配置&#xff08;2&#xff09;主题的默认配置 6.配置 Kafka 集群&#x…

Netty之协议设计

目录 为什么需要协议 redis协议示例 http协议举例 自定义协议 要素 编解码器 测试 为什么需要协议 TCP/IP 中消息传输基于流的方式&#xff0c;没有边界。 协议的目的就是划定消息的边界&#xff0c;制定通信双方要共同遵守的通信规则 例如&#xff1a;在网络上传输 …

c++11 标准模板(STL)(std::ios_base)(三)

定义于头文件 <ios> class ios_base; 类 ios_base 是作为所有 I/O 流类的基类工作的多用途类。它维护数种数据&#xff1a; 1) 状态信息&#xff1a;流状态标志&#xff1b; 2) 控制信息&#xff1a;控制输入和输出序列格式化和感染的本地环境的标志&#xff1b; 3)…

(一)Flask简介和快速使用

关于Python三大Web框架浅谈一嘴&#xff1a; Django、Flask和Tornado三个框架都是Python Web应用的开发框架&#xff0c;虽然它们都能够开发Web应用&#xff0c;但在使用方式、适用领域和处理方式上还是有很多不同的。 Django Django是一个高层次&#xff08;大而全&#xff0…

Flutter自定义系列之折线波动图,心率图,价格走势图

随着前两篇文章的学习&#xff0c;我今天继续给大家演示下简单的自定义之折线波动图&#xff0c;心率图&#xff0c;价格走势图。 这里&#xff0c;我们创建一个自定义的StatefulWidget&#xff0c;用于显示动态的价格线。 我们将使用CustomPaint和CustomPainter来绘制价格线…

chatgpt赋能python:Python中如何截断字符串

Python中如何截断字符串 Python是一种简单易学、高效的编程语言&#xff0c;旨在让开发人员更快、更方便地完成任务。然而&#xff0c;在实际开发过程中&#xff0c;我们常常需要对字符串进行截断操作。那么&#xff0c;Python中怎么截断字符串呢&#xff1f;接下来就让我们来…

如何最大限度地利用ChatGPT、Bard和其他聊天机器人

作者&#xff1a;Hayden Field 译者&#xff1a;明明如月 当下&#xff0c;随着生成式人工智能的发展&#xff0c;面向消费者的聊天机器人能够处理不同领域的需求&#xff0c;并提供相应的帮助和建议&#xff0c;如制定商业战略、设计数学学习指南、提供薪资谈判建议&#xff…

chatgpt赋能python:Python字符串截断-解决方式及实现方法

Python字符串截断-解决方式及实现方法 在Python编程中&#xff0c;处理字符串是一个非常常见的任务。其中&#xff0c;字符串截断也是在许多场景下必不可少的功能之一。Python不仅提供了许多内置函数来处理字符串&#xff0c;而且还有许多方法来截断字符串。 什么是字符串截断…

chatgpt赋能python:Python怎么截图速度快?

Python怎么截图速度快&#xff1f; 在现在这个数字时代&#xff0c;我们所有人都需要进行屏幕截图。无论是用于记录重要笔记&#xff0c;制作教程&#xff0c;或是用于软件质量控制&#xff0c;高速、高质量、高效的屏幕截图工具都非常必要。 在Python编程领域中&#xff0c;…

S3C2440A的ARM工作模式以及寄存器种类

文章目录 前言一、ARM的工作模式二、寄存器的种类&#xff08;注意特殊寄存器的使用&#xff09;总结 前言 本期和大家主要分享的是ARM工作模式以及寄存器种类&#xff0c;不同系列的ARM的工作模式以及寄存器的种类大同小异&#xff0c;所以针对于S3C2440A&#xff0c;一定得通…

【题目解析】第六届字节后端青训营结营小测试全解析

前言 &#x1f44f; Hi! 我是 Yumuing&#xff0c;一个技术的敲钟人 &#x1f468;‍&#x1f4bb; 每天分享技术文章&#xff0c;永远做技术的朝拜者 &#x1f4da; 欢迎关注我的博客&#xff1a;Yumuing’s blog 由于官方答案没有出来&#xff0c;所以&#xff0c;这部分都是…

03.填充中断向量表IDT,使用中断

填充中断描述符表IDT&#xff0c;使用中断 通过初始化中断控制芯片&#xff0c;编码中断函数&#xff0c;实现BIOS中断 操作系统的中断是一种异步事件&#xff0c;用于通知 CPU 某个事件已经发生&#xff0c;例如硬件设备完成数据传输、发生错误或用户发起的系统调用。当操作系…