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

这篇具有很好参考价值的文章主要介绍了Rust每日一练(Leetday0029) 柱状图、最大矩形、扰乱字符串。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

目录

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:

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

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

示例 2:

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

输入: 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:

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

输入: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每日一练(Leetday0029) 柱状图、最大矩形、扰乱字符串

Rust每日一练 专栏

(2023.5.16~)更新中...

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

Golang每日一练 专栏

(2023.3.11~)更新中...

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

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

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

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

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

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

6.13 生日快乐文章来源地址https://www.toymoban.com/news/detail-483321.html

到了这里,关于Rust每日一练(Leetday0029) 柱状图、最大矩形、扰乱字符串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust每日一练(Leetday0025) 矩阵置零、搜索二维矩阵、颜色分类

    目录 73. 矩阵置零 Set Matrix Zeroes  🌟🌟 74. 搜索二维矩阵 Search A 2d-Matrix  🌟🌟 75. 颜色分类 Sort Colors  🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 给定一个  m  x  n  的矩阵,如果一个元

    2024年02月11日
    浏览(28)
  • Rust每日一练(Leetday0012) 首末位置、插入位置、有效数独

    目录 34. 查找元素的首末位置 Find-first-and-last-position-of-element-in-sorted-array  🌟🌟 35. 搜索插入位置 Search Insert Position  🌟 36. 有效的数独 Valid Sudoku  🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专

    2024年02月09日
    浏览(30)
  • 算法leetcode|84. 柱状图中最大的矩形(rust重拳出击)

    给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 1 = heights.length =10 5 0 = heights[i] = 10 4 面对这道算法题目,二当家的再次陷入了沉思。 眼睛一看似乎有思路,但是一动手就容易不知

    2024年02月08日
    浏览(33)
  • Rust每日一练(Leetday0020) 最后单词的长度、螺旋矩阵II、排列序列

    目录 58. 最后一个单词的长度 Length of Last Word  🌟 59. 螺旋矩阵 II Spiral Matrix II  🌟🌟 60. 排列序列 Permutation Sequence  🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 给你一个字符串  s ,由

    2024年02月10日
    浏览(38)
  • Golang每日一练(leetDay0079) 最大正方形、完全二叉树节点数

    目录 221. 最大正方形 Maximal Square  🌟🌟 222. 完全二叉树的节点个数 Count Complete Tree Nodes  🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 在一个由  \\\'0\\\'  和  \\\'1\\\'  组成的二维矩阵内,找到只包

    2024年02月08日
    浏览(31)
  • Rust每日一练(Leetday0027) 单词搜索、删除重复项II、搜索旋转排序数组II

    目录 79. 单词搜索 Word Search  🌟🌟 80. 删除有序数组中的重复项 II Remove-duplicates-from-sorted-array-II  🌟🌟 81. 搜索旋转排序数组 II Search-in-rotated-sorted-array-II  🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 给定一

    2024年02月08日
    浏览(32)
  • Golang每日一练(leetDay0031)

    目录 91. 解码方法  Decode Ways  🌟🌟 93. 复原 IP 地址 Restore IP Addresses  🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 注:92.题 移到206.题之后 92. 反转链表 II Reverse Linked List II 一条包含字母  A-Z  的消息通过以

    2023年04月19日
    浏览(57)
  • Golang每日一练(leetDay0052)

    目录 153. 寻找旋转排序数组中的最小值 Find Minimum In Rotated Sorted Array  🌟🌟 154. 寻找旋转排序数组中的最小值 II Find Minimum In Rotated Sorted Array II  🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 已知一个长度为

    2024年02月02日
    浏览(31)
  • Golang每日一练(leetDay0004)

    目录 10. 正则表达式匹配 Regular Expression Matching  🌟🌟🌟 11. 盛最多水的容器 Container with most water  🌟🌟 12. 整数转罗马数字 Integer to Roman  🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 给你一个字符串 

    2023年04月08日
    浏览(28)
  • Golang每日一练(leetDay0022)

    目录 64. 最小路径和 Minimum Path Sum  🌟🌟 65. 有效数字 Valid Number  🌟🌟🌟 66. 加一 Plus One  🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 给定一个包含非负整数的  m  x  n  网格  grid  ,请找出一条从左上角到

    2023年04月21日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包