代码随想录算法训练营第五十九天 | 下一个更大元素 II、接雨水

● 今日学习的文章链接和视频链接

题目503. 下一个更大元素 II
题目42. 接雨水

● 看到题目的第一想法

基本套路差不多 就是找第一个更大的

● 看完代码随想录之后的想法

接雨水还是尽量掌握双指针的更简单

● 实现过程中遇到哪些困难

接雨水

● 解题代码

  1. 点击查看代码
    class Solution {
        public int[] nextGreaterElements(int[] nums) {
            if(nums.length == 1) return new int[]{-1};
            int len = nums.length;
            int size = nums.length;
            int[] result = new int[len];
            Stack<Integer> stack = new Stack<>();
            stack.push(0);
            Arrays.fill(result,-1);//默认全部初始化为-1
            for(int i = 1;i < 2 * nums.length;i++){
                if(nums[i % size] <= nums[stack.peek()]){
                    stack.push(i % size);
                }else if(!stack.isEmpty() && nums[i % size] > nums[stack.peek()]){
                    while(!stack.isEmpty() && nums[i % size] > nums[stack.peek()]){
                        result[stack.peek()] = nums[i % size];
                        stack.pop();
                    }
                    stack.push(i % size);
                }
            }
            return result;
        }
    }
    
  2. 点击查看代码
    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]){
                    stack.pop();
                    stack.push(index);
                }else{
                    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;
        }
    }
    

● 今日收获,学习时长

今日收获:继续学习了单调栈
学习时长:1h
posted @ 2024-01-26 19:05  雨年今天有记录吗  阅读(0)  评论(0)    收藏  举报