📅  最后修改于: 2023-12-03 15:11:22.743000             🧑  作者: Mango
给定一个N位数字,求其中相邻数字之间的绝对差不增加的数字的个数。例如,对于3位数字,假设为ABC,若有A-B<=B-C,则该数字符合要求。比如,123、121、232都符合要求,而321、345不符合要求。
为求符合条件的数字个数,我们可以暴力枚举每一个N位数字,然后判断其是否符合条件。但是这种方法显然会非常耗时,复杂度为O(10^N),因此需要考虑优化。
观察题目条件不难发现,对于两个相邻的数字i和j(i<j),若i小于j,则i-j比j-(i-1)小;若i大于j,则i-j比(j-1)-i小。因此,我们可以知道,第一个数字可以是0-9中的任意一个,后面的数字必须等于或小于前一个数。
假设我们已经枚举到了某个数字S,S的前一个数为P,S的前k位数字已经满足条件。那么对于S的第k+1位数字,我们可以枚举0-P之间的每一个数字,此时满足条件的数字个数应累加上P-d个数字中满足条件的数字个数,其中d为P-S[k+1]。这样我们可以递推求解,避免了暴力枚举,复杂度为O(N*10^N)。
def count_increasing_digits(n: int) -> int:
dp = [[0] * 10 for _ in range(n + 1)]
for i in range(10):
dp[1][i] = 1
for i in range(2, n + 1):
for j in range(10):
for k in range(j + 1):
dp[i][j] += dp[i - 1][k]
return sum(dp[n])
该算法的时间复杂度为O(N10^N),空间复杂度为O(N10)。