蓝桥杯例题四
每个人都有无限潜能,只要你敢于去追求,你就能超越自己,实现梦想。人生的道路上会有困难和挑战,但这些都是成长的机会。不要被过去的失败所束缚,要相信自己的能力,坚持不懈地努力奋斗。成功需要付出汗水和努力,但只要你坚持不懈,就一定会取得成果。无论遇到什么困难和挫折,都要勇敢面对,坚持追求自己的梦想。不要被他人的眼光和评价所左右,你才是最了解自己的人。相信自己,相信追逐梦想的力量,你一定能够创造奇迹。不要害怕失败,失败只是成功的一部分,只要你勇敢迈出第一步,就是在走向成功的道路上迈进了一大步。坚持努力,追求卓越,你就能成为自己想要成为的人。让我们一起超然励志,勇敢追逐自己的梦想!
蓝桥杯官网蓝桥杯大赛 — 全国大学生TMT行业赛事
刷题力扣 (LeetCode) 全球极客挚爱的技术成长平台
目录
题目7:跳跃游戏
背景描述:
输入格式:
输出格式:
样例输入:
样例输出:
解答过程:
Python代码实现及详细注释:
题目8:旋转数组中的最小值
背景描述:
输入格式:
输出格式:
样例输入:
样例输出:
解答过程:
Python代码实现及详细注释:
总结
题目7:跳跃游戏
背景描述:
给定一个非负整数数组 nums
,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置能够跳跃的最大长度。判断你是否能够到达最后一个位置。
输入格式:
第一行包含一个整数n (1 <= n <= 10^4),表示数组的长度。 第二行包含n个非负整数,表示每个位置上能跳跃的最大长度。
输出格式:
输出一个字符串 "true"
或 "false"
,表示是否可以从第一个位置跳到最后一个位置。
样例输入:
5 2 3 1 1 4
样例输出:
true
解答过程:
贪心算法 是解决此类问题的有效方法。我们维护一个变量 max_reach
来记录当前能到达的最远位置。遍历数组时,更新 max_reach
并检查当前位置是否在 max_reach
范围内。
步骤:
- 初始化:
- 设置
max_reach
为0,表示当前能到达的最远位置。
- 设置
- 遍历数组:
- 对于每一个位置
i
,如果i
大于max_reach
,则无法继续前进,返回false
。 - 更新
max_reach
为i + nums[i]
和max_reach
的较大值。
- 对于每一个位置
- 结果:
- 如果遍历结束且未提前返回
false
,则返回true
。
- 如果遍历结束且未提前返回
Python代码实现及详细注释:
def can_jump(nums): max_reach = 0 for i in range(len(nums)): if i > max_reach: return "false" max_reach = max(max_reach, i + nums[i]) if max_reach >= len(nums) - 1: return "true" return "false" # 示例输入 nums = [2, 3, 1, 1, 4] # 调用函数并打印结果 print(can_jump(nums)) # 输出: true
题目8:旋转数组中的最小值
背景描述:
假设有一个升序排列的数组,在某个未知点进行了旋转(例如,[0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2])。编写一个函数来查找旋转排序数组中的最小值。
输入格式:
第一行包含一个整数n (1 <= n <= 10^4),表示数组的长度。 第二行包含n个整数,表示旋转后的数组。
输出格式:
输出一个整数,表示旋转排序数组中的最小值。
样例输入:
5 4 5 6 7 0 1 2
样例输出:
0
解答过程:
二分查找算法 是解决此类问题的有效方法。通过比较中间元素与右端点元素,可以有效地缩小搜索范围。
步骤:
- 初始化:
- 设置左右指针
left
和right
分别指向数组的两端。
- 设置左右指针
- 二分查找:
- 计算中间索引
mid
,如果nums[mid]
小于nums[right]
,说明最小值在左半部分或就是mid
;否则,最小值在右半部分。 - 根据上述条件调整
left
或right
指针。
- 计算中间索引
- 结果:
- 最终
left
指向的位置即为最小值所在位置。
- 最终
Python代码实现及详细注释:
def find_min(nums): left, right = 0, len(nums) - 1 while left < right: mid = (left + right) // 2 # 如果中间元素小于右端点元素,说明最小值在左半部分或就是mid if nums[mid] < nums[right]: right = mid else: # 否则,最小值在右半部分 left = mid + 1 return nums[left] # 示例输入 nums = [4, 5, 6, 7, 0, 1, 2] # 调用函数并打印结果 print(find_min(nums)) # 输出: 0
总结
这两个题目分别涉及了不同的算法思想和技巧:
- 跳跃游戏 使用了贪心算法来解决问题,适用于处理需要最大化覆盖范围的问题。
- 旋转数组中的最小值 使用了二分查找技术,这是一种高效的查找算法,特别适合用于已排序但经过某种变换的数组。