• 代码随想录算法训练营 单调栈part01


    一、每日温度 

    739. 每日温度 - 力扣(LeetCode)

    从左到右除了最后一个数其他所有的数都遍历一次,最后一个数据对应的结果肯定是 0,就不需要计算。遍历的时候,每个数都去向后数,直到找到比它大的数,这其他数了几次就是对应的值。

    1. public int[] dailyTemperatures(int[] T) {
    2. int length = T.length;
    3. int[] result = new int[length];
    4. for (int i = 0; i < length; i++) {
    5. int current = T[i];
    6. if (current < 100) {
    7. for (int j = i + 1; j < length; j++) {
    8. if (T[j] > current) {
    9. result[i] = j - i;
    10. break;
    11. }
    12. }
    13. }
    14. }
    15. return result;
    16. }
    1. //单调栈方法
    2. class Solution {
    3. public int[] dailyTemperatures(int[] temperatures) {
    4. int lens=temperatures.length;
    5. int []res=new int[lens];
    6. /*
    7. 如果当前遍历的元素 大于栈顶元素,表示 栈顶元素的 右边的最大的元素就是 当前遍历的元素,
    8. 所以弹出 栈顶元素,并记录
    9. 如果栈不空的话,还要考虑新的栈顶与当前元素的大小关系
    10. 否则的话,可以直接入栈。
    11. 注意,单调栈里 加入的元素是 下标。
    12. */
    13. Deque<Integer> stack=new LinkedList<>();
    14. stack.push(0);
    15. for(int i=1;i<lens;i++){
    16. if(temperatures[i]<=temperatures[stack.peek()]){
    17. stack.push(i);
    18. }else{
    19. while(!stack.isEmpty()&&temperatures[i]>temperatures[stack.peek()]){
    20. res[stack.peek()]=i-stack.peek();
    21. stack.pop();
    22. }
    23. stack.push(i);
    24. }
    25. }
    26. return res;
    27. }

    二、下一个更大元素 I  

    496. 下一个更大元素 I - 力扣(LeetCode)

    一旦要求下一个更大的元素,就是用单调栈解!

    思路:

    我们可以先预处理 nums2,使查询 nums1 中的每个元素在 nums2中对应位置的右边的第一个更大的元素值时不需要再遍历 nums2。于是,我们将题目分解为两个子问题:

    第 1 个子问题:如何更高效地计算 nums2中每个元素右边的第一个更大的值;

    第 2 个子问题:如何存储第 1 个子问题的结果。

    算法:

    使用单调栈来解决第 1 个子问题。倒序遍历 nums2,并用单调栈中维护当前位置右边的更大的元素列表,从栈底到栈顶的元素是单调递减的。

    具体地,每次我们移动到数组中一个新的位置 i,就将当前单调栈中所有小于 nums2[i] 的元素弹出单调栈,当前位置右边的第一个更大的元素即为栈顶元素,如果栈为空则说明当前位置右边没有更大的元素。随后我们将位置 i 的元素入栈。

    1. class Solution {
    2. public int[] nextGreaterElement(int[] nums1, int[] nums2) {
    3. Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    4. Deque<Integer> stack = new ArrayDeque<Integer>();
    5. for (int i = nums2.length - 1; i >= 0; --i) {
    6. int num = nums2[i];
    7. while (!stack.isEmpty() && num >= stack.peek()) {
    8. stack.pop();
    9. }
    10. map.put(num, stack.isEmpty() ? -1 : stack.peek());
    11. stack.push(num);
    12. }
    13. int[] res = new int[nums1.length];
    14. for (int i = 0; i < nums1.length; ++i) {
    15. res[i] = map.get(nums1[i]);
    16. }
    17. return res;
    18. }
    19. }

  • 相关阅读:
    Jakob Jenkov 个人博客 JCE 部分(译文)
    基于GoogleNet深度学习网络的花朵类型识别matlab仿真
    Centos7 Shell编程之运算符、条件判断、流程控制、read读取控制台输入
    带你吃透Servlet核心编程下篇(完整图文教程)
    uniapp 利用uni-list 和 uni-load-more 组件上拉加载列表
    测评 | 你是社恐吗?
    Side Window Filtering 论文笔记
    同样是玩手机,有人变有钱了,有人变贫穷了?
    Oracle-day5:新增、复制建表、表结构、表数据、删除
    题目 1054: 二级C语言-计算素数和
  • 原文地址:https://blog.csdn.net/m0_63297917/article/details/133200546