503.力扣每日一题6/24 Java

  • 博客主页:音符犹如代码
  • 系列专栏:算法练习
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍ 

目录

思路

解题方法

复杂度

Code


思路

本题的解题思路主要利用栈的后进先出(LIFO)特性来找到数组中每个元素的下一个更大元素。

解题方法

1.创建一个与输入数组nums相同长度的结果数组result,并初始化为-1,表示如果没有找到下一个更大元素,则结果为-1。
2.创建一个栈stack,用于保存当前还未找到下一个更大元素的数组元素的索引。
3.遍历数组nums两次(或者将数组视为两倍长度的循环数组)。在第一次遍历中,我们只会将索引压入栈中,而在第二次遍历中(通过取模实现),我们会比较当前元素和栈顶元素所指的元素大小,并更新result数组。
4.在遍历过程中,如果当前元素大于栈顶元素所指的元素,那么栈顶元素所指的元素就找到了它的下一个更大元素,我们将这个元素从栈中弹出,并更新result数组。
5.遍历完成后,栈中剩余的元素在数组中都没有下一个更大元素,所以它们的结果保持为-1。

复杂度

时间复杂度:O(2n)=O(n)

空间复杂度:𝑂(𝑛)O(n)

Code

import java.util.ArrayDeque;  
import java.util.Deque;  
  
class Solution{  
    public int[] nextGreaterElements(int[] nums) {  
        int n = nums.length;  
        int[] result = new int[n];  
        Arrays.fill(result, -1); // 初始化结果数组为-1  
  
        Deque<Integer> stack = new ArrayDeque<>();  
  
        // 将nums数组两倍长度连接起来,以便循环搜索  
        for (int i = 0; i < 2 * n; i++) {  
            int num = nums[i % n]; // 通过取模实现循环  
  
            // 如果栈不为空且当前元素大于栈顶元素,更新栈顶元素的下一个更大元素  
            while (!stack.isEmpty() && num > nums[stack.peek()]) {  
                result[stack.pop()] = num;  
            }  
  
            // 将当前索引压入栈中  
            if (i < n) { // 只对前n个元素压栈,因为后n个元素只是为了循环搜索  
                stack.push(i);  
            }  
        }  
  
        return result;  
    }  
}

路漫漫其修远兮,吾将上下而求索。——(屈原)

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值