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

[代码随想录]Day51-单调栈part02

时间:2023-09-22 09:57:27浏览次数:52  
标签:nums int res part02 随想录 len lens Day51 stack

题目:503. 下一个更大元素 II

思路:

总之就是走两次nums,可以拼接,也可以用下面的取余方式。

代码:

func nextGreaterElements(nums []int) []int {
    lens := len(nums)
    res := make([]int, lens)
    for i := 0; i < lens; i++{
        res[i] = -1
    }
    stack := make([]int,0)
    for i:=0; i < lens * 2; i++ {
        for len(stack) > 0 && nums[i%lens] > nums[stack[len(stack)-1]] {
            index := stack[len(stack) - 1]
            stack = stack[:len(stack)-1]
            res[index] = nums[i%lens]
        }
        stack = append(stack, i%lens)
    }
    return res
}

参考:

代码随想录

题目:42. 接雨水

思路:

这个双指针容易想也容易做,找到一个位置左右最高点,然后选其中小的一个减去当前位置高度就是蓄水能力(负数就去掉)。

代码1:

双指针法

func trap(height []int) int {
    lens := len(height)
    lh := make([]int, lens)
    rh := make([]int, lens)
    lh[0] = height[0]
    rh[lens-1]= height[lens-1]
    res := 0
    for i:=1; i<lens;i++ {
        lh[i] = max(lh[i-1],height[i])
    }
    for i := lens-2; i>=0;i-- {
        rh[i] = max(rh[i+1], height[i])
    }
    for i:=1;i<=lens-2;i++ {
        h := min(rh[i], lh[i]) - height[i]
        if h > 0 {
            res += h
        }
    }
    return res
}
func max(a,b int)int{
    if a>b{
        return a
    }
    return b
}
func min(a,b int)int{
    if a<b{
        return a
    }
    return b
}

参考:

代码随想录

标签:nums,int,res,part02,随想录,len,lens,Day51,stack
From: https://www.cnblogs.com/wtcsky/p/17721608.html

相关文章

  • 代码随想录算法训练营-贪心算法-5|56. 合并区间、738. 单调递增的数字、968. 监控二叉
    56. 合并区间时间复杂度:O(nlogn)空间复杂度:O(logn),排序需要的空间开销1classSolution:2defmerge(self,intervals):3result=[]4iflen(intervals)==0:5returnresult#区间集合为空直接返回67int......
  • [代码随想录]Day50-单调栈part01
    题目:思路:要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了维护一个栈顶->栈底由小到大的栈;这样在之后(右侧)遇到更大的数时,就可以得到所有在他前面并且比他小的数,就能获得结果。初始化默认为0;代码:funcdailyTemperatures(n......
  • 随想录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)......
  • ## day11 - 栈与队列part02
    day11-栈与队列part02力扣20.有效的括号思路:利用栈的特性,遇见左括号就把右括号压栈,遇见右括号,就对比和栈顶元素是否相同,不同就返回false。代码classSolution{public:stack<int>st;boolisValid(strings){if(s.size()%2!=0){......
  • 代码随想录算法训练营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......