当前位置: 首页 > wzjs >正文

中国建设银行官方网站悦生活深圳外贸公司前十名

中国建设银行官方网站悦生活,深圳外贸公司前十名,静态网页设计实训报告,南阳建网站企业有哪些单调栈算法入门 单调栈是一种特殊的数据结构应用,它的核心在于维护一个栈,使得栈内元素保持单调递增或者单调递减的顺序。这种数据结构在解决很多算法问题时非常有效,例如求数组中每个元素的下一个更大元素、每日温度问题等。 一、单调栈的…

单调栈算法入门

单调栈是一种特殊的数据结构应用,它的核心在于维护一个栈,使得栈内元素保持单调递增或者单调递减的顺序。这种数据结构在解决很多算法问题时非常有效,例如求数组中每个元素的下一个更大元素、每日温度问题等。

一、单调栈的基本概念

单调栈有两种类型:

  1. 单调递增栈:栈中元素从栈底到栈顶是递增的
  2. 单调递减栈:栈中元素从栈底到栈顶是递减的

两种方法实现起来没有太大区别,单调栈的核心在于维护一个元素单调增单调减的顺序,一般实现都是将数组值或数组对应索引存到栈中,使得该数组元素或索引对应的元素在栈中保持单调性。以单调递增举例,一旦遇到比栈顶元素小的元素便弹出栈顶元素,然后将该元素压入栈中。这是一般单调栈题目的最常用做法

二.单调栈的基本思路

  1. 确定单调性:根据问题需求决定使用递增栈还是递减栈
    • 找下一个更大元素 → 递减栈
    • 找下一个更小元素 → 递增栈
  2. 存储内容
    • 可以存储元素值
    • 也可以存储元素索引(当需要计算距离或位置时)
  3. 遍历方向
    • 可以从左到右遍历
    • 也可以从右到左遍历(根据问题需求)
  4. 边界处理
    • 注意处理栈为空的情况
    • 注意处理遍历完成后栈中剩余元素

三、单调栈的基本实现

以存储数组元素为例,简单看一下单调栈的实现

import java.util.Deque;
import java.util.LinkedList;public class MonotonicStack {// 单调递增栈示例public static void increasingStack(int[] nums) {Deque<Integer> stack = new LinkedList<>();for (int num : nums) {// 当栈不为空且当前元素小于栈顶元素时,弹出栈顶元素while (!stack.isEmpty() && num < stack.peek()) {System.out.println(stack.pop() + " -> " + num);}stack.push(num);}// 处理栈中剩余元素(没有下一个更小元素)while (!stack.isEmpty()) {System.out.println(stack.pop() + " -> -1");}}// 单调递减栈示例public static void decreasingStack(int[] nums) {Deque<Integer> stack = new LinkedList<>();for (int num : nums) {// 当栈不为空且当前元素大于栈顶元素时,弹出栈顶元素while (!stack.isEmpty() && num > stack.peek()) {System.out.println(stack.pop() + " -> " + num);}stack.push(num);}// 处理栈中剩余元素(没有下一个更大元素)while (!stack.isEmpty()) {System.out.println(stack.pop() + " -> -1");}}public static void main(String[] args) {int[] nums = {3, 1, 4, 2, 5};System.out.println("单调递增栈结果:");increasingStack(nums);System.out.println("\n单调递减栈结果:");decreasingStack(nums);}
}

四、单调栈的典型应用

1. 力扣496.下一个更大的元素I

题目描述:nums1 中数字 x下一个更大元素 是指 xnums2 中对应位置 右侧第一个x 大的元素。

给你两个 没有重复元素 的数组 nums1nums2 ,下标从 0 开始计数,其中nums1nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j]下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素

示例 1:

输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {HashMap<Integer, Integer> hs = new HashMap<>();int[] res = new int[nums1.length];Deque<Integer> stack = new LinkedList<>();Arrays.fill(res, -1);for (int i = 0; i < nums1.length; i++) {hs.put(nums1[i], i);}stack.push(0);for (int i = 1; i < nums2.length; i++) {if (nums2[i] > nums2[stack.peek()]) {while (!stack.isEmpty() && nums2[i] > nums2[stack.peek()]) {if (hs.containsKey(nums2[stack.peek()])) {res[hs.get(nums2[stack.peek()])] = nums2[i];}stack.pop();}}stack.push(i);}return res;}
}

2. 力扣739.每日温度

题目描述:给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例 1:

输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
class Solution {public int[] dailyTemperatures(int[] temperatures) {int[] res = new int[temperatures.length];Deque<Integer> stack = new LinkedList<>();stack.push(0);for (int i = 1; i < temperatures.length; i++) {if (temperatures[i] > temperatures[stack.peek()]) {while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {res[stack.peek()] = i - stack.peek();stack.pop();}stack.push(i);} else {stack.push(i);}}return res;}
}

五、复杂度分析

  • 时间复杂度:O(n),每个元素最多入栈和出栈一次
  • 空间复杂度:O(n),最坏情况下所有元素都入栈

通过掌握单调栈算法,可以高效解决许多与元素大小比较相关的问题,同时应该理解,对于一般的单调栈题目,其实都可以用暴力解法求解,但是单调栈显然在时间复杂度上更胜一筹。

http://www.dtcms.com/wzjs/543130.html

相关文章:

  • 重庆石桥铺网站建设做网站ui
  • 面料做电商 哪个网站好在线制作图片视频
  • 南宁网站怎么做seo互联网网站备案表
  • 中国石化工程建设公司网站临沂招聘信息最新招聘
  • 好用的seo软件广东seo推广软件
  • 建设银行官网首页 网站1核1g可以做几个网站
  • 公司网站建设多少费用哪儿济南兴田德润联系电话黄骅港高铁最新进展
  • 简单个人网站设计剁椒怎么做制作方法
  • 网站托管目的是什么重庆网站推广产品企业
  • 学做美食交流网站有哪些做引流推广的平台
  • 东晓南门户网站制作好看网站的浏览器
  • 网站全站开发需要学什么教育集团网站建设
  • 免费建站的平台江西做网站优化好的
  • 免费收录网站推广网站开发案例详解pdf
  • 百度如何建设自己的网站wordpress调用 自定义php代码
  • 网站维保方法0点开服的网页游戏
  • 福建省建设工程信息网站网站内容设计
  • 碑林网站制作电商系统源码哪家好公司
  • 做一家网站费用wordpress前面增加new
  • 自动做简历的网站新产品推广策划方案
  • 网站开发工具总结wordpress 根据id获取分类名称
  • 2018网站建设西安市高新区建设规划局网站
  • 阿里巴巴的网站是自己做的吗大神部落 网站建设
  • 网站网页设计工作内容山东东营市属于几线城市
  • 网站建设方案书 人员安排重庆公共信息交易资源网
  • 邯郸移动网站建设费用怎么看网站域名
  • 阿里指数官方网站聊城的网站制作公司
  • 凡科网站怎么关闭建设中平面设计接私活一般多少钱
  • 网站域名备案主机名seo怎样新建网站
  • 达人设计网官方网站互联网创业项目怎么推广