从390.消除游戏到约瑟夫环:我的LeetCode刷题之旅

作者:暴富20212024.02.23 18:17浏览量:6

简介:本文记录了作者从挑战390.消除游戏开始,逐步深入理解动态规划和环形问题,最终解决约瑟夫环的刷题经历。文章结合生动的实例和图表,为读者提供了可操作的建议和解决问题的方法。

在开始我的LeetCode刷题之旅时,我选择了390.消除游戏作为起点。这道题目要求我们使用动态规划的方法,在给定的矩阵中找到一条路径,使得路径上数字的和恰好为0。我将这道题目作为开端,以便逐渐理解动态规划的精髓。
首先,我分析了题目的要求和限制条件,明确了解题的目标:找到一条路径,使得路径上数字的绝对值之和为0。接下来,我构建了一个二维数组dp,dp[i][j]表示到达位置(i, j)时,路径上数字的绝对值之和。然后,我使用两个循环遍历数组,从左到右、从上到下计算dp值。对于每个位置(i, j),我检查它左侧、上侧和左上侧的dp值,并根据情况更新dp[i][j]的值。
在解决390.消除游戏的过程中,我深入理解了动态规划的思想。动态规划通过将问题分解为子问题并存储子问题的解,避免了重复计算,提高了算法的效率。同时,我也意识到了状态转移方程的重要性,它能够帮助我推导出正确的dp值。
接下来,我开始挑战约瑟夫环问题。约瑟夫环是一个著名的环形问题,描述了这样一个场景:n个人围成一圈,从第一个开始报数,每次数到m的人出圈并继续报数,直到剩下最后一个人。我需要编写一个函数来找出最后留下的人。
在解决约瑟夫环问题时,我首先明确了问题的关键点:如何将问题转化为一个动态规划问题。我使用一个长度为n的数组来表示每个人所处的位置,其中下标表示位置,值表示是否有人(1表示有人,0表示没有人)。然后,我定义了一个长度为m的数组dp,dp[i]表示前i个人需要被淘汰的次数。对于每个位置i,我检查前面i个人中需要被淘汰的次数,如果需要被淘汰的次数为j,则将dp[i]设为j的最小值。
在解决约瑟夫环问题的过程中,我深刻体会到了动态规划的魅力。通过将问题分解为子问题并存储子问题的解,动态规划让我避免了重复计算,提高了算法的效率。同时,我也意识到了状态转移方程的重要性。通过正确的状态转移方程,我能够推导出正确的dp值。
通过解决390.消除游戏和约瑟夫环问题,我不仅提高了自己的算法水平,也深入理解了动态规划的思想和应用。我相信在未来的刷题之旅中,我会继续运用动态规划的思想去解决更多的问题。同时,我也意识到算法的学习是一个持续的过程。我将继续努力,不断挑战自己,提升自己的算法水平。