蓝桥杯例题三

无论前方困难如何重重,我们都要坚定信念,勇往直前。面对挑战和困境,不要退缩,不要放弃,要坚持走下去。当我们感到疲惫时,要告诉自己:"我可以,我一定行!"相信自己的实力和潜力,相信自己能够克服一切困难,创造出更好的未来。在追逐梦想的道路上,我们要保持积极向上的态度,勇敢面对失败和挫折,不断学习和成长。只有付出努力和坚持不懈,才能实现自己的目标,成就自己的人生。让我们怀揣着梦想,勇往直前,创造出属于自己的辉煌!无论风雨多么艰难,只要心中有梦,就能战胜一切困难,迎接属于自己的辉煌人生!

蓝桥杯官网蓝桥杯大赛 --- 全国大学生TMT行业赛事

刷题力扣 (LeetCode) 全球极客挚爱的技术成长平台

目录

题目5:最大矩形面积(柱状图中的最大矩形)

背景描述:

输入格式:

输出格式:

样例输入:

样例输出:

解答过程:

Python代码实现及详细注释:

题目6:最长无重复字符的子串

背景描述:

输入格式:

输出格式:

样例输入:

样例输出:

解答过程:

Python代码实现及详细注释:

总结


题目5:最大矩形面积(柱状图中的最大矩形)

背景描述:

给定一组非负整数表示柱状图的高度,每个柱子的宽度为1。计算柱状图中能够勾勒出来的矩形的最大面积。

输入格式:

第一行包含一个整数n (1 <= n <= 10^5),表示柱状图的高度数组长度。 第二行包含n个非负整数,表示每个柱子的高度。

输出格式:

输出一个整数,表示柱状图中能够勾勒出来的矩形的最大面积。

样例输入:
6
2 1 5 6 2 3
样例输出:
10
解答过程:

单调栈算法 是解决此类问题的有效方法。我们使用一个栈来存储柱子的索引,并确保栈内的柱子高度是递增的。通过遍历柱子并维护栈的状态,我们可以高效地计算出最大矩形面积。

步骤:

  1. 初始化:
    • 创建一个空栈,并在高度数组两端各添加一个高度为0的虚拟柱子以简化边界处理。
  2. 遍历柱子:
    • 对于每一个柱子,如果当前柱子高度大于栈顶柱子高度,则将其索引压入栈;否则,不断弹出栈顶元素并计算以该柱子为高的矩形面积,直到满足条件为止。
  3. 结果:
    • 最终答案是在遍历过程中记录的最大矩形面积。
Python代码实现及详细注释:
def largest_rectangle_area(heights):
    # 在heights两端添加高度为0的虚拟柱子
    heights = [0] + heights + [0]
    stack = []
    max_area = 0
    
    for i in range(len(heights)):
        # 当当前柱子高度小于栈顶柱子高度时,计算以栈顶柱子为高的矩形面积
        while stack and heights[i] < heights[stack[-1]]:
            h = heights[stack.pop()]
            # 计算宽度时,左边界是新的栈顶,右边界是当前柱子
            w = i - stack[-1] - 1
            max_area = max(max_area, h * w)
        # 将当前柱子索引压入栈
        stack.append(i)
    
    return max_area

# 示例输入
heights = [2, 1, 5, 6, 2, 3]

# 调用函数并打印结果
print(largest_rectangle_area(heights))  # 输出: 10

题目6:最长无重复字符的子串

背景描述:

给定一个字符串,请找出其中不含有重复字符的最长子串的长度。

输入格式:

输入一行包含一个字符串s,仅包含小写字母,长度不超过10^5。

输出格式:

输出一个整数,表示不含重复字符的最长子串的长度。

样例输入:
abcabcbb
样例输出:
3
解答过程:

滑动窗口算法 是解决此类问题的有效方法。我们使用两个指针 leftright 来表示当前窗口的左右边界,并使用一个哈希表来记录字符出现的位置。通过移动右指针扩展窗口,并根据需要调整左指针缩小窗口,可以找到最长的无重复字符子串。

步骤:

  1. 初始化:
    • 设置两个指针 leftright,以及一个哈希表 char_index_map 来记录字符及其最新出现的位置。
  2. 扩展窗口:
    • 移动右指针 right 扩展窗口,并检查新加入的字符是否已经在窗口内。
    • 如果字符已经存在,则移动左指针 left 直到窗口内不再包含重复字符。
  3. 更新结果:
    • 每次扩展窗口后,更新最长无重复字符子串的长度。
Python代码实现及详细注释:
def length_of_longest_substring(s):
    char_index_map = {}
    left = 0
    max_length = 0
    
    for right in range(len(s)):
        if s[right] in char_index_map:
            # 如果当前字符已在窗口内,更新左指针位置
            left = max(left, char_index_map[s[right]] + 1)
        
        # 更新当前字符的最新位置
        char_index_map[s[right]] = right
        
        # 更新最大长度
        max_length = max(max_length, right - left + 1)
    
    return max_length

# 示例输入
s = "abcabcbb"

# 调用函数并打印结果
print(length_of_longest_substring(s))  # 输出: 3

总结

这两个题目分别涉及了不同的算法思想和技巧:

  • 最大矩形面积 使用了单调栈来高效解决问题,适用于处理柱状图或直方图相关的问题。
  • 最长无重复字符的子串 使用了滑动窗口技术,这是一种常见的用于处理字符串问题的方法,特别是在寻找特定模式的子串时非常有用。
相关推荐
ThisIsClark9 小时前
【后端面试总结】mysql的group by怎么用
mysql·面试·职场和发展
qystca9 小时前
【16届蓝桥杯寒假刷题营】第2期DAY4
数据结构·c++·算法·蓝桥杯·哈希
JNU freshman9 小时前
线段树 算法
算法·蓝桥杯
qystca12 小时前
【16届蓝桥杯寒假刷题营】第2期DAY5
c++·算法·蓝桥杯·贡献度
BJHHZX199117 小时前
春节期间,景区人满为患,作为文旅企业如何高效解决?
职场和发展·旅游
咒法师无翅鱼21 小时前
【leetcode】T1599
算法·leetcode·职场和发展
一直学习永不止步1 天前
LeetCode题练习与总结:标签验证器--591
java·数据结构·算法·leetcode·职场和发展·字符串·
Joyner20181 天前
python-leetcode-从前序与中序遍历序列构造二叉树
算法·leetcode·职场和发展
Joyner20181 天前
python-leetcode-填充每个节点的下一个右侧节点指针 II
算法·leetcode·职场和发展