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

量产导入 | 产品可靠性测试标准完整大集合(JEDEC/IEC/SAE…) 产品可靠性测试是产品质量保证中的重要一环, 包含有Pre-con, aging(寿命)和ESD(静电)等, 下面就收集了权威标准JEDEC全系列, 请参照如下 同时也附上其它的可靠性标准供大家参考及交叉理解, 可能侧重点不同, 大家可以参考下。 阅读详情

目录

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.youkuaiyun.com/

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 生日快乐

Python计算时间差的方法 使用datetime模块是Python内置的方法,使用timedelta对象可以更精确地计算时间差,而使用dateutil库则提供了更为灵活和方便的操作方式。我们可以使用datetime模块中的datetime类来表示一个具体的日期和时间,并进行相应的运算。在Python中,我们经常需要计算日期和时间之间的差异,例如计算两个日期之间的天数、小时数、分钟数等。Python提供了多种方法来计算时间差,下面我们将介绍其中的几种常用方法,并附上相应的源代码。在上面的代码中,我们使用了dateutil库中的。 阅读详情

相关推荐

Sharding Sphere JDBC使用Mybatis的saveBatch无法返回主键的问题

Sharding Sphere JDBC使用Mybatis的saveBatch无法返回主键的问题

HHCS231的博客 1834

python做excel表格柱状图_运营的 Python 指南 - Python Excel 绘制柱形图

这是一份写给运营人员的Python指南。本文主要讲述如何使用Python操作Excel绘制柱形图。开发工具,环境PyCharmPython3Office Excel前面我们已经创建好了一张Excel表。现在我们要根据已有的数据,往里面添加柱形图。柱形图 BarChart参考《Python openpyxl Excel绘制柱形图》得知,我们主要使用BarChart与BarChart3D类。图表中许多...

weixin_39710249的博客 1417

macOS 27下PlayCover“没有权限打开”的完整修复指南

macOS系统通过Gatekeeper、TCC(透明、同意与控制)和安全启动等机制,对第三方应用进行层层校验,以防范恶意代码。这些机制会检查应用的隔离属性、签名状态以及所需系统权限,当任一环节不满足时,就会出现“没有权限打开”的提示。对于开发者工具或未上架App Store的开源软件,这类拦截尤为常见。尤其在macOS 27上,系统进一步收紧了绕过策略,导致PlayCover等工具无法正常启动。本文以PlayCover为例,详细解析权限链路上的三道关卡,并给出清除隔离属性、调整SIP状态、重置TCC记录等完

weixin_32612263的博客 751

【基础入门题006】求身份证校验位是否正确

【基础入门题】2021.11.02 关于身份证校验位: 1、将前面的身份证号码前17位数分别乘以不同的系数(第1~17位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2); 2、将这17位数字和系数相乘的结果相加; 3、用加出来和除以11,看余数是多少?   4、余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字,其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2; 5、通过上面得知如果余数是2,就会在身份证的第18位数字上

汉阳Hann's Home 1万+

433M遥控器无线解码1527协议

433M遥控器无线解码1527协议,定时器轮询法

weixin_58595117的博客 1万+

BSW:MemMap模块配置及使用

(内存映射(MemMap)模块用于通过内存映射文件将代码和数据映射到特定的内存部分。MemMap生成特定的头文件,其中包含为MemorySection元素和编译器特定指令定义的内存映射预处理器。上面是比较官方的回答,说人话就是把数据和代码放在ECU内指定的地址。初级应用:软件中的bss,data,rodata,code,text,段需要在memory layout中划分具体的物理地址,对于多核系统,要将执行的数据和代码放在目标核的RAM和ROM。

Forever_Oct的博客 3678

Golang每日一练(leetDay0001) 两数之和、两数相加、无重复最长子串

1. 两数之和 Two Sum  2.两数相加 Add Two Numbers  3.无重复字符的最长子串 Longest substring without repeating characters

汉阳Hann's Home 6993

Zabbix故障排查10051端口无法启动:zabbix-server.service: main process exited, code=exited, status=1/FAILURE

zabbix-server.service: main process exited, code=exited, status=1/FAILURE报错说与数据库失去连接。

" DevOps菜鸟(Xu JieHao)" 的博客 2258

【基础入门题032】分糖果问题

【基础入门题】2021.11.28 10个小孩围成一圈分糖果,老师分给第1个小孩10块,第2个小孩2块,第3个小孩8块,第4个小孩22块,第5个小孩16块,第6个小孩4块,第7个小孩10块,第8个小孩6块,第9个小孩14块,第10个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问:经过几轮操作所有小孩手中的糖块数一样多,糖果的块数都是几? 编程语言:包括但不限于Python 题目来源:派森特给站每日刷题频道 ———————————————— cand..

汉阳Hann's Home 6436

将任意文件转换为Pcap网络数据包传输

一款实用的工具用于将任意文件转换为pcap网络数据包

村中少年的专栏 3190

Unity必学:Protobuf-net预编译实战

本文深入解析Unity项目使用Protobuf-net Precompile的必要性。作为高效跨平台序列化方案,Protobuf-net解决了Unity工程在网络同步、存档系统中的性能瓶颈,特别是针对iOS等AOT平台的兼容问题。通过预编译模式,将运行时反射转为静态代码生成,显著提升移动端性能表现,支持协议平滑升级,已成为大厂项目的标配方案。文章从原理、实践到多平台适配,全面展示了这一"序列化发动机"如何支撑现代Unity项目的数据传输需求。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 495

【基础入门题017】切片法求回文数

【基础入门题】2021.11.13 数字323从左往右读与从右往左读是一样的,这种数称为回文数。 请使用for循环以及切片方法设计一个程序, 找出>=m并且<=n的全部回文数(其中m<n)。 例如: 输入: m = 888; n = 2222输出: 888 898 909 919 929 939 949 959 969 979 989 999 1001 1111 1221 1331 1441 1551 1661 1771 1881 1991 2002 2112 2222 编程..

汉阳Hann's Home 5699

AUTOSAR知识点 之 XCP (二):XCP基础概念

学习XCP的过程中,对XCP的基本概念要做一个全面的认知,因为里面有很多缩写以及难以理解的点,假设对此模模糊糊一知半解,那么对整个协议栈的认知会遇到极大的障碍。XCP的信号流传输图示如下XCP 标准主要分为 5 个部分:这部分提供了对于协议的一个概况介绍,包括 XCP 的功能和基础性内容。这部分内容对协议层进行了详细的规范和说明。

梦想技术家 2772

C/C++每日一练(20230222) 部分复制字符串、字典序排列问题、地下城游戏

1. 部分复制字符串(★)   2. 按字典顺序排列问题(★★)   3. 地下城游戏(★★★)

汉阳Hann's Home 5442

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【基础入门题004】转换百分制分数

【基础入门题】2021.10.30 给出一个百分制成绩,要求输出等级为A,B,C,D,E。 90分以上即n>=90为A;80<=n<90分为B;以此类推; 直到n<60分全为E;如果输入小于0或大于100的分数, 则输出“Not valid”。 输入形式:输入一个可能带小数点的分数 输出形式:根据对应关系,输出五分制分数档。 编程语言:包括但不限于Python 题目来源:派森特给站每日刷题频道 ...

汉阳Hann's Home 5403

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【基础入门题030】《孙子算经》之鸡兔同笼

​ 【基础入门题】2021.11.26 《孙子算经》今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何? 编程语言:包括但不限于Python 题目来源:派森特给站每日刷题频道

汉阳Hann's Home 5357

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【基础入门题041】角谷猜想

【基础入门题】2021.12.07 角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3+1,如果是偶数,则除以2,得到的结果再按照上述规则中重复处理,最终总能得到1。 编制一个函数:从输入整数到1的步骤,每一步为一行,每一步都描述计算过程。最后一行输出End;如果输入为1,直接输出End。 编程语言:包括但不限于Python 题目来源:派森特给站每日刷题频道 ———————————————— 方法一:while循环 def guess(n): while n>1: ...

汉阳Hann's Home 5195

【基础入门题002】质因数的个数

【基础入门题】2021.10.29 求一个正整数 n 的所有质因数中不相同的个数。 如果没有质因数则输出0,如: Factor(6) = 2; Factor(7) = 0; Factor(1260) = 4 编程语言:包括但不限于Python 题目来源:派森特给站每日刷题频道 ...

汉阳Hann's Home 5124

【基础入门题043】最大公约数

【基础入门题】2021.12.09 给定两个正整数数,求这两个数的最大公约数。 编程语言:包括但不限于Python 题目来源:派森特给站每日刷题频道 ———————————————— 方法一:for循环 def GCD(m, n): gcd = 1 # 此行可以省略 for i in range(1,min(m, n)+1): if m%i==0 and n%i==0: gcd = i return gcd ...

汉阳Hann's Home 5038

【基础入门题003】分解阶乘的质因数

【基础入门题】2021.10.30 分解 n! 的质因数,写成连乘的样式,因数多于一个用^m表示个数。 如:Factor(6) = 2^4x3^2x5; Factor(8) = 2^7x3^2x5x7 编程语言:包括但不限于Python 题目来源:派森特给站每日刷题频道 ...

汉阳Hann's Home 5030

Python每日一练(20230220) 存在重复元素II、程序功能、分割链表

1.存在重复元素 II   2. 按要求实现程序功能   3. 分割链表

汉阳Hann's Home 4069

【基础入门题049】骰子游戏(二)

【基础入门题】2021.12.15 随机生成1~6范围内的三个数字模拟掷三个骰子,三数之和3~10为小;11~18为大。 请编制程序,要求输入1或0表示猜大小,记录猜测结果,猜满10次退出并输出结果。 编程语言:包括但不限于Python 题目来源:派森特给站每日刷题频道 ...

汉阳Hann's Home 3991

【基础入门题060】数字排列(五)

【基础入门题】2021.12.26 从1~9任取5个数字,能够升序排列出多少个五位数?(如12345,13579,23468) 输出这些五位数。 编程语言:包括但不限于Python 题目来源:派森特给站每日刷题频道

汉阳Hann's Home 3447

【基础入门题001】7的倍数或包含7的正整数

【基础入门题】2021.10.28 求100以内的正整数是7的倍数或包含7的数字并统计总个数。 编程语言:包括但不限于Python 题目来源:派森特给站每日刷题频道

汉阳Hann's Home 3428

组网第63课:安全域划分——Trust/Untrust/DMZ、区域模型、与 VLAN 的关系

一组接口 + 一组策略 + 一条默认拒绝。一组接口:这个域包含哪些物理口、VLAN、子接口;一组策略:这个域到别的域放行什么、拒绝什么;一条默认拒绝:没写进策略的,一律不通。第三条最关键。没有默认拒绝,前面划的域全是装饰。

qq_36765170的博客 542

rust: Fan-out/Fan-in Pattern

本项目基于Rust实现珠宝行业全流程的扇出/扇入模式,采用DDD六层架构。通过ProcessRequestDto与ProcessResponseDto传输数据,将采购、设计、生产等12个业务阶段抽象为可并行执行的FanoutTask子任务。核心由JewelryFanoutFanin实现并行调度:先扇出至12个线程并发执行,再统一扇入汇总结果。系统集成日志(文件+控制台)、重试熔断、内存仓储及依赖注入容器,支持顺序与并发两种调度方式,确保高并发下任务可靠执行与可观测性。

Geovin Du Dream Park 140
上一篇: Golang每日一练(leetDay0095) 第一个错误的版本、完全平方数
下一篇: Golang每日一练(leetDay0096) 添加运算符、移动零
Hann Yang
Hann Yang 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域 领域专家: 算法与数据结构技术领域 领域专家: 算法与数据结构技术领域
博客等级 码龄19年 4万+粉丝 1041原创
评论 96
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hann Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值