青训营X豆包MarsCode 技术训练营刷题讲解 | 豆包MarsCode AI 刷题

163 阅读3分钟

比赛的赢家

题目解析

在使用 豆包MarsCode AI 刷题平台的过程中,我选择了一道关于 数组和双指针 的题目,这里我将详细解析这道题的解题思路、实现细节以及注意事项。

题目:给定一个已排序的数组和一个目标值,要求找到数组中两个数,使得它们的和等于目标值,返回这两个数的索引(索引从1开始)。假设每个输入只会对应一个答案,且不能使用相同的元素两次。

解题思路

这道题的核心是利用数组的排序特性。我们可以通过 双指针 来高效地解决这个问题:

  1. 设置两个指针,一个指向数组的起始位置,另一个指向数组的末尾。
  2. 计算两个指针所指元素的和:
    • 如果和等于目标值,则找到答案。
    • 如果和小于目标值,移动左指针,以增大和的值。
    • 如果和大于目标值,移动右指针,以减小和的值。
  3. 重复上述步骤,直到找到目标值。

代码实现

def two_sum(nums, target):
    left, right = 0, len(nums) - 1
    while left < right:
        current_sum = nums[left] + nums[right]
        if current_sum == target:
            return [left + 1, right + 1]
        elif current_sum < target:
            left += 1
        else:
            right -= 1
    return []

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。每次循环中左指针和右指针中的一个会移动,最多需要遍历整个数组。
  • 空间复杂度:O(1),我们只使用了固定数量的额外空间。

知识总结

在解决这个问题的过程中,我学习并总结了以下知识点:

  1. 双指针技巧:这是一个非常实用的技巧,特别适合用于已排序的数组,能够大大减少时间复杂度。
  2. 数组索引调整:本题的要求是返回从1开始的索引,需要注意在返回结果时对索引做相应的调整。

AC代码


def solution(arr: list, k: int) -> int:
    if k == 1:
        return max(arr)
    
    win_count = 0
    winner = arr[0]
    
    for i in range(1, len(arr)):
        if arr[i] > winner:
            temp = winner
            winner = arr[i]
            win_count = 1
            arr.append(temp)
        else:
            win_count += 1
            arr.append(arr[i])
        
        if win_count == k:
            return winner
    
    return winner

if __name__ == '__main__':
    print(solution(arr=[2, 1, 3, 5, 4, 6, 7, 9], k=2) == 5)
    print(solution(arr=[3, 2, 1, 4], k=10) == 4)
    print(solution(arr=[1, 9, 8, 7, 6, 5, 4, 3, 2, 11], k=7) == 9)

学习建议

对于刚入门的同学,建议在理解题意的基础上,手动模拟几次双指针的过程。这有助于理解指针如何移动以及为什么在不同条件下选择不同的指针移动方向。

学习计划

使用 豆包MarsCode AI 刷题的过程中,我总结了一套高效的学习方法:

  1. 每天固定时间刷题:制定一个合理的计划,确保每天完成一定数量的题目,尤其是涵盖不同知识点的题目。
  2. 记录错题:将错题和易错点记录下来,并定期回顾。可以通过错题集的积累,发现自己的薄弱点,并进行针对性学习。
  3. 分阶段训练:例如先练习数组与双指针、哈希表等基础题型,再逐步进阶到动态规划、树结构等较复杂的题型,逐步提升难度。

工具运用

除了 豆包MarsCode AI 的题目训练功能,合理结合其他资源可以进一步提升学习效果:

  1. 结合题解视频或解析:遇到不理解的题目时,可以查阅解析视频,这样会有更直观的理解。
  2. 在论坛讨论:刷题平台通常有讨论区,可以和其他同学交流解题思路和不同的解决方案。
  3. 使用LeetCode或LintCode练习:将不同平台的题目结合,可以接触到更多样的题目,提高刷题的全面性。

通过这套方法和工具的结合,可以更加系统、全面地提升算法和编程能力。