leetcode每日一题之7.下一个更大元素 II
下一个更大元素 II
思路及解法
可以使用单调栈来解决这个问题。假如[9,8,7,10]这个数组,比9,8,7大的数字为10。即如果i
比i-1
小的话,则i
和i-1
的下一个最大数字相等。所以
- 如果
i<i-1
,则入栈 - 如果
i>i-1
,则出栈,直到栈顶的值大于i。
循环数组
因为该数组是循环的数组,可能出现[9,7,8,6]这种情况,比6大的数字为9。可以两种方法
- 一种实现方式是,把数组复制一份到数组末尾,这样虽然不是严格的循环数组,但是对于本题已经足够了,因为本题对数组最多遍历两次。
- 另一个常见的实现方式是,使用取模运算 %可以把下标
i
映射到数组 numsnums 长度的0 - N
内。
代码如下
class Solution {
/**
* @param Integer[] $nums
* @return Integer[]
*/
function nextGreaterElements($nums) {
$length = count($nums);
$stack = [];
$res = [];
for($i = 0; $i < $length; ++$i){
$res[] = -1;
}
for($i = 0; $i < $length * 2 - 1; ++$i){
while(count($stack) > 0 && $nums[$stack[count($stack) - 1]] < $nums[$i % $length]){
$res[$stack[count($stack) - 1]] = $nums[$i % $length];
array_pop($stack);
}
array_push($stack, $i % $length);
}
return $res;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现