- 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。