无论前方困难如何重重,我们都要坚定信念,勇往直前。面对挑战和困境,不要退缩,不要放弃,要坚持走下去。当我们感到疲惫时,要告诉自己:“我可以,我一定行!”相信自己的实力和潜力,相信自己能够克服一切困难,创造出更好的未来。在追逐梦想的道路上,我们要保持积极向上的态度,勇敢面对失败和挫折,不断学习和成长。只有付出努力和坚持不懈,才能实现自己的目标,成就自己的人生。让我们怀揣着梦想,勇往直前,创造出属于自己的辉煌!无论风雨多么艰难,只要心中有梦,就能战胜一切困难,迎接属于自己的辉煌人生!
蓝桥杯官网蓝桥杯大赛 — 全国大学生TMT行业赛事
刷题力扣 (LeetCode) 全球极客挚爱的技术成长平台
目录
题目5:最大矩形面积(柱状图中的最大矩形)
背景描述:
输入格式:
输出格式:
样例输入:
样例输出:
解答过程:
Python代码实现及详细注释:
题目6:最长无重复字符的子串
背景描述:
输入格式:
输出格式:
样例输入:
样例输出:
解答过程:
Python代码实现及详细注释:
总结
题目5:最大矩形面积(柱状图中的最大矩形)
背景描述:
给定一组非负整数表示柱状图的高度,每个柱子的宽度为1。计算柱状图中能够勾勒出来的矩形的最大面积。
输入格式:
第一行包含一个整数n (1 <= n <= 10^5),表示柱状图的高度数组长度。 第二行包含n个非负整数,表示每个柱子的高度。
输出格式:
输出一个整数,表示柱状图中能够勾勒出来的矩形的最大面积。
样例输入:
6 2 1 5 6 2 3
样例输出:
10
解答过程:
单调栈算法 是解决此类问题的有效方法。我们使用一个栈来存储柱子的索引,并确保栈内的柱子高度是递增的。通过遍历柱子并维护栈的状态,我们可以高效地计算出最大矩形面积。
步骤:
- 初始化:
- 创建一个空栈,并在高度数组两端各添加一个高度为0的虚拟柱子以简化边界处理。
- 遍历柱子:
- 对于每一个柱子,如果当前柱子高度大于栈顶柱子高度,则将其索引压入栈;否则,不断弹出栈顶元素并计算以该柱子为高的矩形面积,直到满足条件为止。
- 结果:
- 最终答案是在遍历过程中记录的最大矩形面积。
Python代码实现及详细注释:
def largest_rectangle_area(heights):# 在heights两端添加高度为0的虚拟柱子heights = [0] + heights + [0]stack = []max_area = 0for i in range(len(heights)):# 当当前柱子高度小于栈顶柱子高度时,计算以栈顶柱子为高的矩形面积while stack and heights[i] < heights[stack[-1]]:h = heights[stack.pop()]# 计算宽度时,左边界是新的栈顶,右边界是当前柱子w = i - stack[-1] - 1max_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
解答过程:
滑动窗口算法 是解决此类问题的有效方法。我们使用两个指针 left
和 right
来表示当前窗口的左右边界,并使用一个哈希表来记录字符出现的位置。通过移动右指针扩展窗口,并根据需要调整左指针缩小窗口,可以找到最长的无重复字符子串。
步骤:
- 初始化:
- 设置两个指针
left
和right
,以及一个哈希表char_index_map
来记录字符及其最新出现的位置。
- 设置两个指针
- 扩展窗口:
- 移动右指针
right
扩展窗口,并检查新加入的字符是否已经在窗口内。 - 如果字符已经存在,则移动左指针
left
直到窗口内不再包含重复字符。
- 移动右指针
- 更新结果:
- 每次扩展窗口后,更新最长无重复字符子串的长度。
Python代码实现及详细注释:
def length_of_longest_substring(s):char_index_map = {}left = 0max_length = 0for 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
总结
这两个题目分别涉及了不同的算法思想和技巧:
- 最大矩形面积 使用了单调栈来高效解决问题,适用于处理柱状图或直方图相关的问题。
- 最长无重复字符的子串 使用了滑动窗口技术,这是一种常见的用于处理字符串问题的方法,特别是在寻找特定模式的子串时非常有用。