• 代码随想录之单调栈|739. 每日温度,496.下一个更大元素 I


    单调栈专门解决Next Greater Number,这句点题

    739. 每日温度

    暴力超时

    1. class Solution {
    2. public int[] dailyTemperatures(int[] temperatures) {
    3. //双指针解法
    4. int slow=0;
    5. int fast=1;
    6. while(fast<temperatures.length){
    7. if(temperatures[fast]<=temperatures[slow]){
    8. fast++;
    9. }
    10. else{
    11. temperatures[slow]=fast-slow;
    12. slow++;
    13. fast=slow+1;
    14. }
    15. if(fast==temperatures.length-1&&fast-slow!=1){
    16. temperatures[slow]=0;
    17. slow++;
    18. fast=slow+1;
    19. }
    20. //处理倒数第2
    21. if(fast==temperatures.length-1&&fast-slow==1&&temperatures[fast]<=temperatures[slow]){
    22. slow--;
    23. temperatures[slow]=0;
    24. }
    25. }
    26. // System.out.println(slow);
    27. temperatures[temperatures.length-1]=0;
    28. return temperatures;
    29. }
    30. }

    单调栈写法

    单调栈中存放的是元素的下标,单调栈从栈头(开口处)到栈底是递增的

    使用单调栈主要有三个判断条件。

    • 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
    • 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
    • 当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况

    代码实现

    1. class Solution {
    2. public int[] dailyTemperatures(int[] temperatures) {
    3. int[] res=new int[temperatures.length];
    4. Deque<Integer> stack=new LinkedList<>();
    5. stack.push(0);
    6. //记住单调栈存放的是元素的下标
    7. for(int i=1;i<temperatures.length;i++){
    8. if(temperatures[i]<=temperatures[stack.peek()]){//当前遍历的元素小于等于栈顶元素,直接把下标入栈
    9. stack.push(i);
    10. }
    11. else{
    12. while(!stack.isEmpty()&&temperatures[i]>temperatures[stack.peek()]){//一定要加上后面这个大于的判断,因为如果!stack.isEmpty()但可能有temperatures[i]<=temperatures[stack.peek()]的情况
    13. res[stack.peek()]=i-stack.peek();
    14. stack.pop();
    15. }
    16. stack.push(i);
    17. }
    18. }
    19. return res;
    20. }
    21. }

    496.下一个更大元素 I

     重点没有重复元素 的数组 nums1 和 nums2

    这道题的解法有点绕啊

    首先对nums1:把元素和其对应的下标存放到map中

    其次遍历nums2数组:注意栈存放的是nums2元素的下标,是下标!

    如果当前元素小于等于栈顶下标对应的元素,说明当前元素不是要寻找的第一个更大,直接将其下标入栈;

    如果当前元素大于栈顶下标对应的元素,说明就是在nums2中找到了第一个更大的,这时对栈进行非空判断,如果当前nums2栈顶元素也在map中出现的话,说明是nums1需要的,我们找到这个元素在nums1的下标位置index,这时候把当前遍历下标对应的元素值 赋值给index

    上面有点绕,总而言之,就是在nums2中寻找nums1中元素的右边最大,需要纸笔画一下清楚。

    代码实现 

    1. class Solution {
    2. public int[] nextGreaterElement(int[] nums1, int[] nums2) {
    3. int[] res=new int[nums1.length];
    4. Stack<Integer> stack = new Stack<>();//用来遍历的nums2下标
    5. Arrays.fill(res,-1);
    6. HashMap<Integer,Integer> hashMap=new HashMap<>();
    7. for(int i=0;i<nums1.length;i++){
    8. hashMap.put(nums1[i],i);
    9. }
    10. stack.push(0);
    11. for(int i=1;i<nums2.length;i++){
    12. if(nums2[i]<=nums2[stack.peek()]){//当前元素小于等于栈顶元素也依然入栈
    13. stack.push(i);//存放的是下标,下标是递增的
    14. }
    15. else{//当前下标元素大于栈顶下标元素
    16. while(!stack.isEmpty()&&nums2[stack.peek()]<nums2[i]){
    17. if(hashMap.containsKey(nums2[stack.peek()])){
    18. Integer index=hashMap.get(nums2[stack.peek()]);
    19. res[index]=nums2[i];
    20. }
    21. stack.pop();
    22. }
    23. stack.push(i);
    24. }
    25. }
    26. return res;
    27. }
    28. }

  • 相关阅读:
    8-图文打造LeeCode算法宝典-最小栈与LRU缓存机制算法题解
    怎么他们都有开源项目经历|手把手教你参与开源
    MyBatisPlus 查询条件构造器(Wapper)
    基于Android的个人电子相册设计与实现
    qt 关于自定义控件,然后其他页面提升后背景样式表不生效问题
    Mamba: Linear-Time Sequence Modeling with Selective State Spaces论文笔记
    MySql安全加固:无关或匿名帐号&是否更改root用户&避免空口令用户&是否加密数据库密码
    一篇文章带你搞懂前端Cookie
    【025】mongoose V6.4开启debug日志打印
    LINQ详解二(C#)
  • 原文地址:https://blog.csdn.net/m0_67042480/article/details/133244980