【随想录】Day57—第九章 动态规划part17

目录

  • [题目1: 每日温度](#题目1: 每日温度)
  • [题目2: 下一个更大元素 I](#题目2: 下一个更大元素 I)
    • [1- 思路](#1- 思路)
    • [2- 题解](#2- 题解)
      • [⭐ 下一个更大元素 I------题解思路](#⭐ 下一个更大元素 I——题解思路)

题目1: 每日温度


1- 思路

个人思路-暴力超时

  • 暴力解法,双层 for 循环 根据外层的 i 通过 j 来遍历数组。
    • 如果当前 i小于 j 的元素,则记录 j-i。
java 复制代码
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int[] res = new int[temperatures.length];

        // 双层 for
        for(int i = 0; i < temperatures.length;i++){
            for(int j = i ; j < temperatures.length;j++){
                if( temperatures[j] > temperatures[i]){
                    res[i] = j-i;
                    break;
                }else if(j == temperatures.length-1){
                    res[i] = 0;
                }
            }
        }
        return res;
    }
}

单调栈的意义
  • 单调栈 可以帮你找出,数组中右边元素 第一个比当前元素大的元素是什么、或者找左边第一个比当前元素大的元素。
本题中单调栈的作用
  • 本题中单调栈的作用是存放我们遍历过的元素
  • 之前遍历过哪些元素,和当前元素作对比

本题单调栈中存储的值

  • 如何存储,比较?
    • 直接存放下标
  • 递增栈还是递减栈?
    • 递增 or 递减 指的是单调栈从栈口 到 栈底 的位置
    • 递增:求得是右边第一个比当前元素大的元素
    • 递减:求得是右边第一个比当前元素小的元素

思路

  • 拿当前遍历到的元素 与 单调栈 的栈顶 元素做对比 ------> 根据三种情况进行判断,大于、小于、等于
  • 当前元素 大于 栈顶元素:nums[i] > nums[st.peek()],
    • 此时记录结果 res[st.peek()] = i - st.pop;
  • 当前元素 小于 栈顶元素:
    • 此时当前元素入栈,所以保证的是一个单调递增的栈
  • 当前元素 等于 栈顶元素:
    • 此时当前元素入栈

2- 题解

⭐ 每日温度 ------题解思路

java 复制代码
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int[] res = new int[temperatures.length];
        // 定义单调栈
        Stack<Integer> st = new Stack();
        st.push(0);
        // 遍历 temperatures
        for(int i = 1 ; i < temperatures.length;i++){
            if(temperatures[i] <= temperatures[st.peek()]){
                st.push(i);
            }else{
                while(!st.isEmpty() && temperatures[i] > temperatures[st.peek()]){
                    res[st.peek()] = i - st.peek();
                    st.pop();
                }
                st.push(i);
            }
        }
        return res;
    }
}

题目2: 下一个更大元素 I


1- 思路

  • 1- 定义 nums1 大小的结果集
  • 2- 定义 Map 来寻找对应 nums2 中元素是否在 nums1 中
  • 3- 遍历维持单调队列

2- 题解

⭐ 下一个更大元素 I------题解思路

java 复制代码
class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int[] res1 = new int[nums1.length];
        Arrays.fill(res1,-1);
        Stack<Integer> st = new Stack();
        st.push(0);

        // 针对 nums1 建立 Map
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0 ; i < nums1.length;i++){
            map.put(nums1[i],i);
        }

        // 3- 维护 单调栈
        for(int i = 1 ; i < nums2.length;i++){
            if(nums2[i] <= nums2[st.peek()]){
                st.push(i);
            }else{
                while(!st.isEmpty() && nums2[i] > nums2[st.peek()]){
                    if(map.containsKey(nums2[st.peek()])){
                        int index = map.get(nums2[st.peek()]);
                        res1[index] = nums2[i];
                    }
                    st.pop();
                }
                st.push(i);
            }
        }
        return res1;
    }
}

相关推荐
严肃小白兔10 分钟前
MATLAB 数值计算中的精度与误差问题:浮点运算、误差传播与数值稳定性
人工智能·算法·matlab
青少儿编程课堂1 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛
jktantan2 小时前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构
Dream it possible!15 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
心抵鹊15 小时前
算法之双指针系列(一)
算法·leetcode
十二15 小时前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
小此方16 小时前
[算法实战论:动态规划]回文串问题的dp解法,回文串问题的母题,以及以此为基础的派生题
算法·动态规划
Pniubi17 小时前
力扣560.和为k的子数组
算法·leetcode·职场和发展
D e re k ZH17 小时前
C++ 从零入门(一):基础语法与程序结构
数据结构·c++·算法
Pniubi18 小时前
力扣438.找到字符串中所有字母异位词
算法·leetcode·职场和发展