首页 > 其他分享 >day 59 503.下一个更大元素II | 42. 接雨水

day 59 503.下一个更大元素II | 42. 接雨水

时间:2023-04-30 09:11:14浏览次数:41  
标签:index 59 int 元素 42 503 height stack size

给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。

示例 1:

  • 输入: [1,2,1]
  • 输出: [2,-1,2]
  • 解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

 

将两个nums数组拼接在一起,使用单调栈计算出每一个元素的下一个最大值,最后再把结果集即result数组resize到原数组大小就可以了。

class Solution {
    public int[] nextGreaterElements(int[] nums) {
        if (nums == null || nums.length == 0) {
            return new int[]{-1};
        }
        int size = nums.length;
        int[] result = new int[size];
        Arrays.fill(result, -1);
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < 2 * size; i++) {
            while(!stack.isEmpty() && nums[stack.peek()] < nums[i % size]) {
                result[stack.peek()] = nums[i % size];
                stack.pop();
            }
            stack.push(i % size);
        }
        return result;
    }
}

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

  • 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
  • 输出:6
  • 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

示例 2:

  • 输入:height = [4,2,0,3,2,5]
  • 输出:9

以下逻辑主要就是三种情况

  • 情况一:当前遍历的元素(柱子)高度小于栈顶元素的高度 height[i] < height[st.top()]
  • 情况二:当前遍历的元素(柱子)高度等于栈顶元素的高度 height[i] == height[st.top()]
  • 情况三:当前遍历的元素(柱子)高度大于栈顶元素的高度 height[i] > height[st.top()]

先将下标0的柱子加入到栈中,st.push(0);。 栈中存放我们遍历过的元素,所以先将下标0加进来。

然后开始从下标1开始遍历所有的柱子,for (int i = 1; i < height.size(); i++)

如果当前遍历的元素(柱子)高度小于栈顶元素的高度,就把这个元素加入栈中,因为栈里本来就要保持从小到大的顺序(从栈头到栈底)

 
class Solution {
    public int trap(int[] height) {
        int size = height.length;
        if (size <= 2) return 0;

        Stack<Integer> stack = new Stack<Integer>();
        stack.push(0);


        int sum = 0;
         for (int index = 1; index < size; index++){
            int stackTop = stack.peek();
            if (height[index] < height[stackTop]){
                stack.push(index);
            }else if (height[index] == height[stackTop]){
                // 因为相等的相邻墙,左边一个是不可能存放雨水的,所以pop左边的index, push当前的index
                stack.pop();
                stack.push(index);
            }else{
                //pop up all lower value
                int heightAtIdx = height[index];
                while (!stack.isEmpty() && (heightAtIdx > height[stackTop])){
                    int mid = stack.pop();

                    if (!stack.isEmpty()){
                        int left = stack.peek();

                        int h = Math.min(height[left], height[index]) - height[mid];
                        int w = index - left - 1;
                        int hold = h * w;
                        if (hold > 0) sum += hold;
                        stackTop = stack.peek();
                    }
                }
                stack.push(index);
            }
        }
        return sum;

    }
}

 

 

标签:index,59,int,元素,42,503,height,stack,size
From: https://www.cnblogs.com/libertylhy/p/17364906.html

相关文章

  • Hugging News #0428: HuggingChat 来啦
    每一周,我们的同事都会向社区的成员们发布一些关于HuggingFace相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「HuggingNews」,本期HuggingNews有哪些有趣的消息,快来看看吧!HuggingChat来啦!我们认为需要有一个Ch......
  • 【230429-4】求所有仅由1,2,3,4,5组成的没有重复数字的四位数的和
    【数学解法】由1,2,3,4,5组成的没有重复数字的四位数有A54=120个以千位为例,在此出现的1,2,3,4,5的几率是均等的,即每个数都出现了120/5=24次。也就是说,120个数的千位加起来是(1*24+2*24+3*24+4*24+5*24)*1000=15*24*1000同样的道理,120个数的百位加起来是(1*24+2*24+3*24+4*24+5*24)*100=15*2......
  • 【230429-3】证明:任意给出九个空间格点,其至少有一对格点的奇偶性相同,且其中点坐标亦为
    【名词解释:格点】格点即三坐标都为整数的空间点,因其位置在虚拟的网格上故称格点。【格点奇偶性的八种情况】代码证明:packagetest230429;/***按奇偶性确定空间中格点的种类*格点,即xyz三坐标皆为整数的空间点*xyz为奇偶各有两种可能性,整体便有2^3=8种*8种意味着:一旦点......
  • python+playwright 学习-59 grant_permissions 设置默认允许麦克风和摄像头等权限
    前言有些场景在使用的时候,会弹出一些权限框,比如麦克风和摄像头等,通过监听alert是没法捕获的。正确做法是给浏览器设置默认允许麦克风和摄像头等权限,不让弹窗出来。使用context的grant_permissions方法加权限。权限框弹窗示例这种弹窗是权限窗,不是alert解决办法context有个gr......
  • 【230429-2】用三重循环输出立方体的八个顶点坐标
    【代码】packagetest230429;/***输出立方体的八个顶点坐标*边长为a的立方体一角在(0,0,0),其对角在(a,a,a),求所有顶点的坐标*这是一个可重排列问题,在2阶集合{"0","a"}中进行3次选取。*使用三重循环即可解决此问题。*/publicclassCubeTops{publicstaticvoid......
  • cf-edu-142.D
    题目链接:https://codeforces.com/problemset/problem/1792/D算法:tire树求最长公共前缀(lcp)。反思:题目转换出的题意已大致得到,但怎么具体求不会。思路:tire树维护一个结构,1在哪些位置出现,2在哪些位置出现,以此类推。代码:#include<bits/stdc++.h>usingnamespacestd;consti......
  • Qt音视频开发42-网络推流(视频推流/本地摄像头推流/桌面推流/网络摄像头转发推流等)
    一、前言上次实现的文件推流,尽管优点很多,但是只能对现在存在的生成好的音视频文件推流,而现在更多的场景是需要将实时的视频流重新推流分发,用户在很多设备比如手机/平板/网页/电脑/服务器上观看,这样就可以很方便的将分散的视频流统一集中的流媒体服务器上,然后统一对外分发视频,而不......
  • P4423 题解
    前言题目传送门!更好的阅读体验?刚学分治就来写篇题解纪念一下,其实和平面最近点对一样的(总共四倍经验!)。思路根据P7883的分治思路,这题我们可以考虑用相似的方法解决。首先将点集按\(x\)坐标从小到大排序。然后分治。对于\(\left[l,r\right]\)区间,分治为\(\left[l,mid......
  • 总结20230428
    代码时间(包括上课):1h代码量(行):30行博客数量(篇):1篇相关事项:1、今天上午第一节课是计算机网络,开启了运输层的新篇章。2、今天上午第二节是概率论,讲的是概率论的方差、协方差、相关系数等知识。3、今天晚上打算在学一点Javaweb的知识。......
  • [ABC142E] Get Everything
    2023-02-18题目题目传送门翻译翻译难度&重要性(1~10):5题目来源AtCoder题目算法状压dp解题思路我们令\(S\)表示当前箱子状态,\(P_i\)表示第\(i\)把钥匙能开的箱子。设\(f_S\)表示开启当前状态箱子的最小花费。能得到转移方程:\(f_{P_i|i}=\min(f_{P_i|i},f_i+......