力扣496_下一个更大元素I

题目描述
给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。
请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。

输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于 num1 中的数字 4 ,你无法在第二个数组中找到下一个更大的数字,因此输出 -1 。
对于 num1 中的数字 1 ,第二个数组中数字1右边的下一个较大数字是 3 。
对于 num1 中的数字 2 ,第二个数组中没有下一个更大的数字,因此输出 -1 。

算法思想
单调栈,用于解决这一类“找更大元素”的问题。
我们先把这道题简单化,假设我们找的是nums2中每个元素的更大值,如nums2=[1,3,4,2],我们返回一个res=[3,5,-1,-1],这样的问题,我们从后往前遍历数组,数组中的每一个元素都会入栈,在入栈之前,我们先把栈中比它小的元素出栈,旨在找到它后面的第一个大于它的数,如果栈最后为空,表示后面的元素都比它小或者它在末尾,这样它的返回值就为-1,如果栈不为空,则栈顶的元素就是第一个比它大的数(返回值),这样遍历一遍,即可得到每个数的更大数。
那么,这道题该怎么做呢?
基本思想基本不变,只是在遍历数组的时候,把每个数的更大数存入哈希表里,然后nums1从哈希表里找到对应的值。

代码如下

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Deque<Integer> stack = new LinkedList();
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = nums2.length-1;i >= 0;i--){
            while(!stack.isEmpty() && stack.peek() < nums2[i]){
                stack.pop();
            }  
            map.put(nums2[i], stack.isEmpty()?-1:stack.peek());
            /*  把以下简化      
            if(stack.isEmpty()){
                map.put(nums2[i], -1);              
            }else{
                map.put(nums2[i], stack.peek());               
            }
            */
            stack.push(nums2[i]);
        }

        int[] res = new int[nums1.length];
        for(int j = 0;j < nums1.length;j++){
            res[j] = map.get(nums1[j]);
        }
        return res;

    }
}

复杂度分析
时间复杂度:两个数组分别遍历一次,O(m+n)
空间复杂度:用到一个与nums2相同大小的栈以及哈希映射使用的空间,O(n)

一些小的细节:
(1)求数组长度使用.length;而求字符串长度使用.length()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断一个链表是否是另一个链表的子序列是一道常见的问题。对于这个问题,我们可以使用双指针的方法来解决。双指针一个指向主链表,一个指向子序列链表。我们同时遍历两个链表,比较指针指向的节点是否相同。如果相同,我们就同时向后移动两个指针;如果不相同,我们只移动主链表的指针。当子序列链表遍历完毕时,说明所有的节点都匹配成功,那么它是主链表的子序列;如果主链表遍历完毕,而子序列链表还没有遍历完,说明子序列链表中的节点没有完全匹配,那么它不是主链表的子序列。这种方法的时间复杂度是O(n + m),其中n是主链表的长度,m是子序列链表的长度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [力扣之判断一个链表是否是回文链表](https://blog.csdn.net/chenbaifan/article/details/121450273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [[力扣] 203.移除链表元素](https://download.csdn.net/download/weixin_38667920/13759251)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值