📅  最后修改于: 2023-12-03 15:26:29.110000             🧑  作者: Mango
最长非递减子序列是指在给定序列中,找到最长的子序列,使得相邻元素之间的差异至多为1。这是一个经典的问题,也有很多解法。
动态规划是这个问题的一个经典解法。具体实现方式如下:
这个解法的时间复杂度是 $O(n^2)$。
贪心法+二分查找是这个问题的另一个经典解法。这个解法的关键在于如何定义贪心策略。具体实现方式如下:
这个解法的时间复杂度是 $O(n\log n)$。
两种解法都是经典的解法,各有优缺点。动态规划适用于数据规模较小的情况,而贪心法+二分查找则适用于数据规模较大的情况。具体实现时需要注意边界条件和细节问题,如空序列、空指针等。
# 动态规划解法的Python代码实现
def LNDSS(a):
n = len(a)
dp = [1] * n
for i in range(1, n):
for j in range(i):
if a[i] >= a[j]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
# 贪心法+二分查找解法的Python代码实现
import bisect
def LNDSS(a):
n = len(a)
ans = []
for i in range(n):
j = bisect.bisect_left(ans, a[i])
if j == len(ans):
ans.append(a[i])
else:
ans[j] = a[i]
return len(ans)