【LeetCode Easy】496. Next Greater Element I

本文详细解析了LeetCode题目“下一个更大元素I”的两种解法。首先介绍了直观但效率较低的三重循环解决方案,时间复杂度为O(n*m²)。随后提出了一种更高效的方法,利用栈和哈希映射,将时间复杂度降低至O(n),并附带代码实现。

原题链接

我的思路:

按stack的tag找到的这题,结果第一个AC的思路完全没有用到stack(orz
一个直观且简单且时间复杂度高的思路,三个for循环嵌套,很好理解,不多做解释了,最坏情况下的时间复杂度是O(n * m²) (其中n和m分别为nums1的长度和nums2的长度

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int[] res = new int[nums1.length];        
        
        for(int i = 0; i < nums1.length; i++) {
            res[i] = -1;
            for(int j = 0; j < nums2.length; j++) {
                if (nums2[j] == nums1[i]) {
                    for (int k = j; k < nums2.length; k++){
                        if (nums2[k] > nums2[j]) {
                            res[i] = nums2[k];
                            break;
                        }
                    }
                    break;
                }
            }
        }
        return res;
    }
}

更好的解法:

一个??的(用了栈的)思路(就是那种评论都是why are you guys so smart的思路
首先总体来说这个方法是把nums2中所有的value的next greater element都找出来了。
最关键的步骤在于,遍历nums2中的每个element,对于每个element,如果它比栈顶值小,那么直接入栈,如果比栈顶值大,那么栈中所有元素都比这个element小,也就是栈中所有元素的next greater element都是这个element。题解中用了一个hashmap来存element和其next greater element的对应
(下面的code来自参考链接)

    public int[] nextGreaterElement(int[] findNums, int[] nums) {
        Map<Integer, Integer> map = new HashMap<>(); // map from x to next greater element of x
        Stack<Integer> stack = new Stack<>();
        for (int num : nums) {
            while (!stack.isEmpty() && stack.peek() < num)
                map.put(stack.pop(), num);
            stack.push(num);
        }   
        for (int i = 0; i < findNums.length; i++)
            findNums[i] = map.getOrDefault(findNums[i], -1);
        return findNums;
    }

参考链接:

https://leetcode.com/problems/next-greater-element-i/discuss/97595/Java-10-lines-linear-time-complexity-O(n)-with-explanation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值