单调数

该博客介绍了一类名为单调数的正整数,即递增数和递减数,并给出了求解小于10^n的单调数个数的动态规划方法。博主详细阐述了状态转移方程的推导过程,包括对于不同位数和限制条件下的单调数计数,最后展示了AC代码,尽管代码可以优化,但博主在紧张的时间内成功解决问题。
摘要由CSDN通过智能技术生成

问题 E: 单调数

时间限制: 1 Sec   内存限制: 128 MB
提交: 27   解决: 11
[ 提交][ 状态][ 讨论版]

题目描述

对于一个正整数x,如果x的每一位都不大于它右边一位上的数字,那么就称x是递增数,例如:112455718899111

单调栈是一种常见的据结构,在解决一些特定问题时非常有用。它可以用来求解一些范围内的最大值、最小值、最长连续递增子序列等问题。下面是一个简单的 Python 实现: ``` class MonotonicStack: def __init__(self): self.stack = [] def push(self, val): while self.stack and self.stack[-1] < val: self.stack.pop() self.stack.append(val) def pop(self): self.stack.pop() def top(self): return self.stack[-1] def is_empty(self): return len(self.stack) == 0 ``` 这个单调栈实现了四个基本操作: - push(val):将元素 val 压入栈中。在压入之前,如果栈顶元素比 val 小,则弹出栈顶元素,直到栈顶元素比 val 大或栈为空,然后将 val 压入栈中。 - pop():弹出栈顶元素。 - top():返回栈顶元素。 - is_empty():判断栈是否为空。 使用单调栈的时候,需要根据具体问题来实现 push 操作。下面是一个例子,求解一个组中每个元素右边第一个比它大的: ``` def next_larger(nums): n = len(nums) res = [-1] * n stack = MonotonicStack() for i in range(n): while not stack.is_empty() and nums[stack.top()] < nums[i]: res[stack.top()] = nums[i] stack.pop() stack.push(i) return res ``` 在这个例子中,我们维护了一个单调递减的栈,每次遇到一个比栈顶元素大的,就将栈顶元素弹出,并将栈顶元素的答案设为当前。这样,最后栈中剩下的元素都没有右边比它们大的,它们的答案就是 -1。时间复杂度为 O(n)。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值