青训营X豆包MarsCode 技术训练营第六课 | 豆包MarsCode AI 刷题

42 阅读4分钟

题目解析:选择“盛最多水的容器”题目

题目描述
给你 n 个非负整数 a1,a2,...,an,每个数代表一个坐标点 (i, ai)。在坐标内画 n 条垂直线,使得 i 垂直线的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴构成的容器可以容纳最多的水。

思路

  1. 双指针法:使用两个指针分别指向数组的首尾,计算当前两个指针所指向的线条构成的容器的面积,然后移动指针。如果移动较高线条的指针,则可能找到更高的线条以增加面积;如果移动较低线条的指针,则可能找到更宽的容器以增加面积。
  2. 暴力法:遍历每对线条,计算它们构成的容器的面积,并找出最大值。这种方法时间复杂度较高,为 O(n^2)。

图解
假设数组为 [1,8,6,2,5,4,8,3,7],通过双指针法,初始时左指针指向第一个元素(1),右指针指向最后一个元素(7)。计算面积后,根据高低移动指针,直到两指针相遇。

代码详解(Python,双指针法):

python复制代码
	def maxArea(height):

	    # 初始化左右指针

	    left, right = 0, len(height) - 1

	    # 初始化最大面积

	    max_area = 0

	    # 当左指针小于右指针时循环

	    while left < right:

	        # 计算当前面积

	        current_area = min(height[left], height[right]) * (right - left)

	        # 更新最大面积

	        max_area = max(max_area, current_area)

	        # 移动指针

	        if height[left] < height[right]:

	            left += 1

	        else:

	            right -= 1

	    return max_area

	 

	# 示例测试

	height = [1,8,6,2,5,4,8,3,7]

	print(maxArea(height))  # 输出: 49

知识总结

新知识点

  • 双指针法:一种高效的数组遍历方法,通常用于解决需要同时考虑数组两端元素的问题。
  • 贪心策略:在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。

理解
双指针法通过同时处理数组的两端,可以在一次遍历中解决问题,大大提高了效率。在本题中,通过比较左右指针所指向的线条的高度,决定移动哪个指针,从而找到最大的容器面积。

学习建议

  • 入门同学应先理解双指针法的基本原理和应用场景,再通过实际题目练习加深理解。
  • 尝试将双指针法应用于其他问题,如“有序数组的两数之和”、“合并两个有序数组”等。

学习计划

制定刷题计划

  1. 分阶段练习:按照数据结构与算法的知识点分阶段进行练习,如先练习数组和链表,再练习哈希表和树等。
  2. 定时挑战:给自己设定时间限制,挑战在规定时间内完成一定数量的题目。
  3. 复盘总结:完成题目后,复盘总结解题思路和方法,归纳出通用的解题模板。

利用错题进行针对性学习

  1. 分类整理:将错题按照知识点或题型进行分类整理,方便后续复习。
  2. 深度剖析:对于错题,要深入剖析错误原因,是概念不清、方法不会还是计算失误等。
  3. 举一反三:针对错题,尝试找出类似题目进行练习,以巩固知识点。

工具运用

将 AI 刷题功能与其他学习资源相结合

  1. 结合在线课程:在学习数据结构与算法的在线课程时,利用 MarsCode AI 刷题功能进行同步练习和巩固。
  2. 参与竞赛讨论:参与 MarsCode 的编程竞赛和社区讨论,与其他用户交流解题思路和技巧。
  3. 利用智能推荐:根据 MarsCode AI 的智能推荐功能,选择适合自己水平和兴趣的题目进行练习。

学习建议

  • 保持好奇心:对于新的数据结构和算法要保持好奇心和探索欲,主动学习和尝试。
  • 多维度学习:除了刷题外,还可以通过阅读算法书籍、观看视频教程、参加线上讲座等多种方式学习。
  • 坚持实践:理论学习后要及时通过实践来巩固和检验所学知识,避免“眼高手低”。