首页 > 编程语言 >代码随想录算法训练营day47| 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II

代码随想录算法训练营day47| 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II

时间:2024-11-15 21:08:11浏览次数:1  
标签:nums 元素 随想录 len 索引 更大 新元素 stack 单调

学习资料:https://programmercarl.com/0739.每日温度.html#算法公开课

单调栈:
用数组模拟单调栈,今天的题中,栈中元素都保存的索引值
基本思路:将新元素和栈顶索引对应值比较,如果要保持单调递增,则需要新元素不大于栈顶索引对应值;若满足就加入新元素索引到栈中;若不满足,就根据具体题意看是否找到目标值了,然后通过循环不断弹出栈顶值,知道新元素不大于栈顶值了,就把新元素索引加到栈中
循环数组:
当遇到循环数组问题,可以取模法:索引范围*2,再对每个索引取模 i%len(nums)

学习记录:
739.每日温度(单调栈;单调递增)

点击查看代码
class Solution(object):
    def dailyTemperatures(self, temperatures):
        """
        :type temperatures: List[int]
        :rtype: List[int]
        """
        # 单调栈解法,本题设定为递增,栈顶到栈底值越来越大(难点:栈中存放的是数的索引)

        # 先初始化结果数组,默认没有更高温度的出现
        answer = [0]*len(temperatures)    # 当后面几天没有更高温度时也不用处理了,因为本来初值就定为0了
        # 构建一个单调栈,还是数组的形式
        stack = [0]
        # 开始遍历温度
        for i in range(1, len(temperatures)):
            if temperatures[i] <= temperatures[stack[-1]]:   # 新元素的值<栈顶值,符合单调递增,加入栈
                stack.append(i)
            else:
                while len(stack) != 0 and temperatures[i] > temperatures[stack[-1]]:
                    # 记录结果
                    answer[stack[-1]] = i-stack[-1]
                    # 弹出栈顶值,因为这天的更高温度已经找到,如果还满足循环添加,则还要继续弹出
                    stack.pop()
                # 当栈顶对应值不再小于新元素时,加入新元素
                stack.append(i)
        return answer
        

496.下一个更大元素1(单调栈变形;当新元素大于栈顶索引对应值时,还得判断栈顶索引对应值是否是nums1中的元素,如果是,则找到目标值,即nums1在nums2中的更大值即为新元素)

点击查看代码
class Solution(object):
    def nextGreaterElement(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        # 单调栈,特别之处:如果nums2的栈顶值<nums2遍历到的当前值,再判断栈顶值在不在nums1里面,如果在,就说明找到了nums1中数字的在nums2中的下一个更大元素
        # 构造单调栈
        stack = [0]   # 栈中保存的是索引!!!!!!!!!!!!!
        # 结果的保存,初值都设置为-1
        ans = [-1]*len(nums1)
        # 遍历nums2
        for i in range(1, len(nums2)):
            if nums2[stack[-1]] >= nums2[i]:
                stack.append(i)
            else:
                while len(stack) != 0 and nums2[stack[-1]]<nums2[i]:    # 防止空栈;当新元素大于栈顶元素
                    # 看栈顶元素是否在nums1中,如果在,就说明找到了nums1对应元素的下一个更大值,也就是新元素
                    if nums2[stack[-1]] in nums1:
                        # 保存结果
                        index = nums1.index(nums2[stack[-1]])
                        ans[index] = nums2[i]
                    # 不管怎样都要弹出栈顶,保证单调递增
                    stack.pop()
                # 当新元素不大于栈顶值时,向单调栈加入新元素
                stack.append(i)
        return ans

503.下一个更大元素2(单调栈+循环数组)

点击查看代码
class Solution(object):
    def nextGreaterElements(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        # 单调栈+环形数组问题
        # 当遇到环形数组,
            # 法一:扩展数组为其二倍,如[2,3,4]变成[2,3,4,2,3,4]
            # 法二: 索引取模法,for i in range(len(nums)*2): 后续中用i%len(nums),这样保证索引值一直是0,1,2
        
        # 构建单调栈,保存索引值
        stack = [0]
        # 构建结果数组
        result = [-1]*len(nums)
        # 开始2倍遍历
        for i in range(len(nums)*2):
            # 对索引取模
            i_mod = i%len(nums)
            # 新元素不大于栈顶值,满足单调递增
            if nums[i_mod] <= nums[stack[-1]]:
                stack.append(i_mod)    # 记住栈中保存的是索引
            else:
                # 开始循环,一直到新元素不大于栈顶值位置
                while len(stack) != 0 and nums[i_mod] > nums[stack[-1]]:
                    # 收集结果
                    result[stack[-1]] = nums[i_mod]   # 栈顶值的下一个更大元素是nums[i_mod]
                    # 弹出当前已经收集了结果的栈顶值
                    stack.pop()
                # 加入新元素
                stack.append(i_mod)
        return result
        

PS:今天阴转小雨,不冷;周五吃的很随意,排骨面,自选菜,味道都一般,但是吃得饱;很累啊,论文有了新进展,理清了行文思路;
这周没有找工作进展,是等待的一周,希望下周等到机会~

标签:nums,元素,随想录,len,索引,更大,新元素,stack,单调
From: https://www.cnblogs.com/tristan241001/p/18548654

相关文章

  • Stream流统计集合元素出现次数并降序
    使用Arrays.stream()结合Collectors.groupingBy()和Collectors.counting()来统计数组中每个元素出现个数,按照出现次数降序排列后获取前五个元素及其出现次数的示例代码:importjava.util.*;importjava.util.stream.Collectors;publicclassArrayElementCountTopFive{......
  • 代码随想录算法训练营day46| 647. 回文子串 516.最长回文子序列
    学习资料:https://programmercarl.com/0647.回文子串.html#算法公开课动态规划最后一部分:回文字符串子串是从原字符串中连续截取的;子序列可以是从原字符串中不连续提取出元素构成的学习记录:647.回文子串(难构造dp数组,dp数组是从原字符串截取[i,j]范围的片段是否是回文字符串,布尔......
  • 代码随想录:有序数组的平方
    代码随想录:有序数组的平方仍然是双指针,一开始也想到了双指针,不过很笨的创造了两个数组,一个负数的一个正数的,两个数组比大小后插入。但其实可以直接把原数组平方后,从左右两边插入。有两点值得注意:1.已知数组大小的情况下,可以直接倒着插入数组。2.创建vector时需要指定元素的个数......
  • 前端技术中对表格元素的学习
    表格元素目录表格元素rowspan(行合并)colspan(列合并)注意事项在HTML中,<table>表格元素允许你通过特定的属性来合并单元格。这通常用于创建更复杂的表格布局,比如跨越多行或多列的标题或数据。合并单元格可以通过rowspan和colspan属性来实现。rowspan(行合并)rowspan属性用于合并垂......
  • 代码随想录算法训练营第一天| 704. 二分查找、35.搜索插入位置、27. 移除元素、977.有
    文档讲解:代码随想录视频讲解:代码随想录状态:完成4道题一、数组理论基础数组:连续内存空间,存储类型相同的元素集合,适合读不适合写注意:Python里可以存储不同类型的元素,但刷题时都是按照相同元素去做的相同元素占用存储的空间大小是一样的,下一个元素的位置就确定了数组时间......
  • 代码随想录算法训练营第二天| 209.长度最小的子数组、59. 螺旋矩阵 II
    文档讲解:代码随想录视频讲解:代码随想录状态:完成2道题滑动窗口滑动窗口:两个指针一前一后组成滑动窗口,并计算滑动窗口中的元素的问题适用场景:字符串匹配问题、子数组问题、定长问题滑动窗口模板:如果一个字符进入窗口,应该增加windows计数器;如果一个字符将移除窗口的......
  • 代码随想录算法训练营第三十天| 452. 用最少数量的箭引爆气球 、435. 无重叠区间 、76
    452.用最少数量的箭引爆气球思路:以前做过最大不相交子序列的题,这次也是往这根据某一端排序的思路想的,排序后如下图,只需要维护一个公共序列的右边界r就可以了,下一次判断时,只需要判断子区间的左边是否小于r。这个题有点坑的是使用Arrays排序,如果使用昨天的方法:Arra......
  • 代码随想录算法训练营 | 200.岛屿的数量
    岛屿的数量题目链接:https://leetcode.cn/problems/number-of-islands/此题目要点:dfs和bfs都可以解决此题,但是使用dfs代码会更加的简洁首先对grid进行遍历,每一个节点都进行检查,判断是否是1(陆地)如果是,则进行dfs深搜,并将所有搜到的岛屿节点全置为0,表示此块岛屿已经被搜过了,防......
  • UI自动化测试|元素操作&浏览器操作实践
    前言Selenium自动化测试是一种广泛使用的Web自动化测试工具,它允许测试人员编写自动化测试脚本来模拟用户在Web浏览器中的操作,从而实现对Web应用程序的自动化测试。这里分享元素操作&浏览器操作1.Selenium之元素操作Selenium是一种常用的自动化测试工具,它提供了一组丰富的......
  • 鸿蒙 Next 元素定位
    在鸿蒙next中,子元素想要相对于父元素定位会使用到.opsition()这个属性,用法如下:@Entry@ComponentstructPositionExample1{build(){Column(){Row(){}.position({x:50,y:50})}.width('100%').height('100%')}}cbwe.hgyb0831.com,cbwe.bochendoor.c......