欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > Leetcode 3409. Longest Subsequence With Decreasing Adjacent Difference

Leetcode 3409. Longest Subsequence With Decreasing Adjacent Difference

2025/2/25 14:16:45 来源:https://blog.csdn.net/codename_cys/article/details/144956236  浏览:    关键词:Leetcode 3409. Longest Subsequence With Decreasing Adjacent Difference
  • Leetcode 3409. Longest Subsequence With Decreasing Adjacent Difference
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3409. Longest Subsequence With Decreasing Adjacent Difference

1. 解题思路

这一题做的很失败,虽然只是一个medium的题目,但是我没有自力搞定这道题,最后是对着大佬们的解答才理解了这道题的解法的,委实有点惭愧……

这道题的思路就是动态规划,这个倒是没啥疑问,剩下的就是如何进行这个动态规划,或者说设计怎么的数据存储内容来进行复用。

这里大佬们的做法是给出了一个矩阵dp,其中,任意元素dp[i][j]表示当前一个元素的值为 i i i,且前两个元素的差值的绝对值不小于 j j j时,其最多包含的元素个数。

然后,我们依次来从左到右考察每一个位置上的元素被取用时对矩阵中元素的影响,不妨设当前位置上的元素为x,其前一个元素为y,则显然,我们有以下两个迭代关系:

  • dp[x][abs(x-y)] = max(dp[x][abs(x-y)], 1 + dp[y][abs(x-y)])
  • dp[x][delta] = max(dp[x][delta], dp[x][delta+1])

由此,我们进行一下遍历即可得到所有的可能性,然后所有取出第一列元素的最大值,即可得到我们最终的答案。

2. 代码实现

给出python代码实现如下:

class Solution:def longestSubsequence(self, nums: List[int]) -> int:m = max(nums)nums = [x-1 for x in nums]dp = [[-m for _ in range(m)] for _ in range(m)]for num in nums:for pre in range(m):delta = abs(num - pre)dp[num][delta] = max(dp[num][delta], dp[pre][delta]+1)for delta in range(m-1, -1, -1):dp[num][delta] = max(dp[num][delta], 1)if delta < m-1:dp[num][delta] = max(dp[num][delta], dp[num][delta+1])return max(dp[num][0] for num in range(m))

提交代码评测得到:耗时11133ms,占用内存21.8MB。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词