• 137、LeetCode-503.下一个更大元素Ⅱ


    题目:

    给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

    数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。

    示例 1:

    输入: nums = [1,2,1]
    输出: [2,-1,2]
    解释: 第一个 1 的下一个更大的数是 2;
    数字 2 找不到下一个更大的数; 
    第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/next-greater-element-ii

    思路:

    本题是将数组变为循环数组:因此单调栈的查找需要 2*N的长度;

    创建一个新的数组,然后进行单调栈的判断,同时需要判断下标是否越界

    代码:

    1)单调栈思想

    1. class Solution {
    2. public int[] nextGreaterElements(int[] nums) {
    3. //两个数组拼成一个,时间复杂度为 o(2N)
    4. int l = nums.length;
    5. int[] nums1 = new int[2 * l];
    6. //将新的数组赋值
    7. for(int i = 0;i < 2 * l;i++){
    8. nums1[i] = nums[i % l];
    9. }
    10. int[] res = new int[l];
    11. Arrays.fill(res,-1);
    12. Stack stack = new Stack<>();
    13. for(int i = 0;i < 2 * l;i++){
    14. while(!stack.isEmpty() && nums1[i] > nums1[stack.peek()]){
    15. int index = stack.pop();
    16. if(index < l){
    17. res[index] = nums1[i];
    18. }
    19. }
    20. stack.push(i);//这次往里面放下标
    21. }
    22. return res;
    23. }
    24. }

    同样可以不构件新的数组,直接在原有的数组基础上,每次都取余即可

    1. class Solution {
    2. public int[] nextGreaterElements(int[] nums) {
    3. //两个数组拼成一个,时间复杂度为 o(2N)
    4. int l = nums.length;
    5. int[] res = new int[l];
    6. Arrays.fill(res,-1);
    7. Stack stack = new Stack<>();
    8. for(int i = 0;i < 2 * l;i++){
    9. while(!stack.isEmpty() && nums[i % l] > nums[stack.peek() % l]){
    10. int index = stack.pop();
    11. if(index < l){
    12. res[index] = nums[i % l];
    13. }
    14. }
    15. stack.push(i);//这次往里面放下标
    16. }
    17. return res;
    18. }
    19. }

    可以继续简化,判断条件

    1. class Solution {
    2. public int[] nextGreaterElements(int[] nums) {
    3. //两个数组拼成一个,时间复杂度为 o(2N)
    4. int l = nums.length;
    5. int[] res = new int[l];
    6. Arrays.fill(res,-1);
    7. Stack stack = new Stack<>();
    8. for(int i = 0;i < 2 * l;i++){
    9. while(!stack.isEmpty() && nums[i % l] > nums[stack.peek()]){
    10. res[stack.pop()] = nums[i % l];
    11. }
    12. if(i < l)
    13. stack.push(i);//这次往里面放下标
    14. }
    15. return res;
    16. }
    17. }

  • 相关阅读:
    大腿神经网络解剖图片,大腿神经网络解剖图谱
    springMVC异常处理的知识点+异常处理案例
    服务器(windows Server 2019为例)中的日志中文乱码的解决办法
    三层交换机的工作原理
    HyperLynx(九)HDMI仿真实例
    Linux下的进程控制
    TDesign:腾讯的企业级前端框架,对标elementUI和ant-design
    基于Skywalking开发分布式监控(四)一个案例
    LoRA Land: 310个经微调的大语言模型可媲美GPT-4
    【go语言基础】go类型断言 type switch + case,t := x.(type)
  • 原文地址:https://blog.csdn.net/weixin_54532276/article/details/126773720