首页 > 其他分享 >[代码随想录]Day50-单调栈part01

[代码随想录]Day50-单调栈part01

时间:2023-09-21 10:35:12浏览次数:49  
标签:part01 res top 随想录 len int Day50 stack nums2

题目:

思路:

要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了
维护一个 栈顶->栈底 由小到大的栈;这样在之后(右侧)遇到更大的数时,就可以得到所有在他前面并且比他小的数,就能获得结果。
初始化默认为0;

代码:

func dailyTemperatures(num []int) []int {
    res := make([]int, len(num))
    stack := []int{}
    for i, v := range num {
        for len(stack) != 0 && v > num[stack[len(stack)-1]] {
            top := stack[len(stack)-1]
            stack = stack[:len(stack)-1]
            res[top] = i - top
        }
        stack = append(stack, i)
    }
    return res
}

参考:

代码随想录

题目:496. 下一个更大元素 I

思路:

比上面一个题多了一步,如果只有nums2那么这道题和上面一样,多了一步是需要按照nums1的顺序把nums2的结果输出。

代码:

func nextGreaterElement(nums1 []int, nums2 []int) []int {
    res := make([]int, len(nums1))
    mp := make(map[int]int)
    for i := 0; i <len(nums1); i++ {
        res[i] = -1
        mp[nums1[i]] = i
    }
    stack := []int{}
    stack = append(stack, 0)
    for i := 1; i < len(nums2); i++ {
        for len(stack) > 0 && nums2[i] > nums2[stack[len(stack)-1]] {
            top := stack[len(stack)-1]
            if _, ok := mp[nums2[top]]; ok {
                index := mp[nums2[top]]
                res[index] = nums2[i]
            }
            stack = stack[:len(stack)-1]
        }
        stack = append(stack, i)
    }
    return res
}

参考:

代码随想录

标签:part01,res,top,随想录,len,int,Day50,stack,nums2
From: https://www.cnblogs.com/wtcsky/p/17719261.html

相关文章

  • 随想录Day1|704. 二分查找、27. 移除元素
    随想录Day1|704.二分查找、27.移除元素 704.二分查找LeetCode题目文章讲解视频讲解给定n个元素升序的整形数组nums和一个目标值target,写一个函数搜索nums中的target,如果存在目标值则返回下标,否则返回-1。其中nums中的元素不重复,n在[1,10000]之间,nums的每个元素都在[-......
  • [代码随想录]Day49-动态规划part17
    题目:647.回文子串思路:整体上是两种,就是s[i]与s[j]相等,s[i]与s[j]不相等这两种。当s[i]与s[j]不相等,那没啥好说的了,dp[i][j]一定是false。当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况情况一:下标i与j相同,同一个字符例如a,当然是回文子串情况二:下标i与j相差为1,例如aa......
  • [代码随想录]Day48-动态规划part16
    题目:583.两个字符串的删除操作思路:还是最长公共子序列,假设最长公共子序列长度是l;那么需要删除的次数是len(s1)-l+len(s2)-l代码:funcminDistance(word1string,word2string)int{lens1:=len(word1)lens2:=len(word2)dp:=make([][]int,lens1+......
  • 代码随想录算法训练营第十一天
    代码随想录算法训练营第十一天|LeetCode239(滑动窗口最大值)LeetCode347(前K个高频元素)239:滑动窗口最大值LeetCode239(滑动窗口最大值)importjava.util.Deque;importjava.util.LinkedList;classSolution{publicint[]maxSlidingWindow(int[]nums,intk)......
  • 代码随想录算法训练营day13| ● 239. 滑动窗口最大值 ● 347.前 K 个高频元素 ● 总结
    239.滑动窗口最大值mydemo--(自己思路)--failed超出时间限制classSolution{public:vector<int>maxSlidingWindow(vector<int>&nums,intk){vector<int>result;stack<int>stack;intlen=nums.size();for(......
  • 代码随想录算法训练营day11| ● 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复
    20.有效的括号卡哥democlassSolution{public:boolisValid(strings){if(s.size()%2!=0)returnfalse;stack<char>st;for(inti=0;i<s.size();i++){if(s[i]=='(')st.push('......
  • 代码随想录算法训练营-贪心算法-4|406. 根据身高重建队列、452. 用最少数量的箭引爆
    406. 根据身高重建队列1. 一定要想如何确定一个维度,然后再按照另一个维度重新排列。2.先确定身高的维度,降序排列。3. 按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。4. 局部最优:优先按身高高的peop......
  • [8]-代码随想录算法训练营-day9-字符串-part2
    代码随想录算法训练营第九天|字符串-part21.Leecode28.找出字符串中第一个匹配项的下标题目https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/思路暴力for循环刷随想录后想法KMP模式匹配算法实现困难KMP算法理解......
  • [7]-代码随想录算法训练营-day8-字符串-part1
    代码随想录算法训练营第八天|数组字符串-part11.Leecode344.反转字符串题目https://leetcode.cn/problems/reverse-string/思路刷随想录后想法双指针,用swap实现困难无实现代码classSolution{public:voidreverseString(vector<char>&s){......
  • 代码随想录算法训练营-回溯算法-2|55. 跳跃游戏、45. 跳跃游戏 II、1005. K 次取反后
    55. 跳跃游戏1.跳跃的覆盖范围。这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!2. 贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。时间复杂度:O(n)空间复杂度:O(1)1classSolution:2defca......