一、题目解析:
在 MarsCode AI 的刷题之旅中,有一道关于图的最短路径问题令我印象深刻。题目给定一个有向加权图,要求求出指定起点到其他各点的最短路径长度。解题思路是利用迪杰斯特拉算法,其核心是维护一个距离数组和一个已访问节点集合。每次从尚未访问的节点中选择距离起点最短的节点,然后更新与该节点相邻的未访问节点的距离。
代码实现如下: def solution(n, max, array): from collections import Counter card_counts = Counter(array) max_three_of_a_kind = 0 max_pair = 0 for card_value, count in card_counts.items(): if count >= 3: for other_card_value, other_count in card_counts.items(): if other_card_value!= card_value and other_count >= 2: sum_value = card_value * 3 + other_card_value * 2 if sum_value <= max and (card_value > max_three_of_a_kind or (card_value == max_three_of_a_kind and other_card_value > max_pair)): max_three_of_a_kind = card_value max_pair = other_card_value return [max_three_of_a_kind, max_pair] if max_three_of_a_kind > 0 else [0, 0]
if name == "main": print(solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1]) == [8, 5]) print(solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13]) == [6, 9]) print(solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6]) == [0, 0]) # 新增测试用例 print(solution(31, 42, [3,3,11,12,12,2,13,5,13,1,13,8,8,1,8,13,12,9,2,11,3,5,8,11,1,11,1,5,4,2,5]) == [1,13]) 通过这个代码,我们可以清晰地看到算法的实现过程。从创建距离字典、初始化优先队列,到不断更新距离和节点状态,每一步都至关重要。
二、知识总结
在这个过程中,我学到了图论中的重要算法 —— 迪杰斯特拉算法。它的核心思想是贪心策略,总是选择当前最优解。对于初学者来说,理解图的存储方式(这里使用邻接表)以及算法中的数据结构(如优先队列)是关键。我理解到算法是一种解决问题的高效手段,而图这种数据结构在实际中可以模拟很多复杂的网络关系,比如交通网络、社交网络等。对于刚入门的同学,建议多从简单的图示例入手,手动计算最短路径,体会算法的每一步操作,这样有助于理解算法的本质。
三、学习计划
在刷题计划方面,我会根据数据结构和算法的分类来制定。比如先集中学习图相关的算法,包括深度优先搜索、广度优先搜索等。每天安排适量的题目,从简单到复杂逐步递进。对于错题,我会认真分析原因。如果是对算法理解不足,会重新复习算法原理,通过画图、写伪代码等方式加深理解。如果是代码实现问题,会仔细检查代码逻辑和语法错误。同时,我会定期回顾之前做过的题目,尤其是错题,确保在后续的学习中不会再犯同样的错误。在学习新的算法后,尝试用新算法去解决之前做过的类似题目,对比不同算法的优缺点。
四、工具运用
我充分利用 MarsCode AI 的刷题功能,它提供了丰富的题目类型和详细的解析。同时,我结合在线课程学习,课程中的理论讲解可以帮助我更好地理解算法原理。在遇到困难时,我会在编程论坛上与其他开发者交流,获取不同的解题思路。此外,我还会使用一些可视化工具来展示图和算法的执行过程,比如将图的结构和最短路径的搜索过程以动画的形式展示出来,这有助于直观地理解算法的运行机制,从而提高学习效果。通过这些方法的综合运用,我能更全面、深入地学习编程知识和算法。