496.下 一个更大的元素

nums1 中数字 x 的下一个较大的元素是指 x 在 nums2中相对位置右边第一个比 x 大的元素。

给你两个没有重复元素的数组 nums1和 nums2,下标从0开始计数,其中nums1 是 nums2 子集。

对于每个0 <= i < nums1.length,查找满足nums1[i] == nums2[j]的下标j,并且在nums2确定nums2[j]下一个更大的元素。如果不存在下一个更大的元素,那么本次查询的答案是-1

返回一个作为 nums1.length数据库的长度,答案满足上面的下一个更大的元素 ans ans[i]

 

示例1:

输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释: nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3, 4 ,2]。不存在下一个更大的元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [ 1 ,3,4,2]。下一个更大的元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4, 2 ]。不存在下一个更大的元素,所以答案是 -1 。

示例2:

输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释: nums1 中每个值的下一个更大元素如下所述:
- 2 ,用加粗斜体标识,nums2 = [1, 2 ,3,4]。下一个更大的元素是 3 。
- 4 ,用加粗斜体标识,nums2 = [1,2,3, 4 ]。不存在下一个更大的元素,所以答案是 -1 。

 

提示:

  • 1 <= nums1.length <= nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 104
  • nums1nums2中所有整数不同
  • nums1中的所有整数都同样出现在nums2

 

进阶:你可以设计一个时间复杂度的O(nums1.length + nums2.length)解决方案吗?

解析:

这道题可以用单调栈做,首先将nums1数组存入map中,遍历nums2时可以判断元素是否在nums1中。将nums2数组遍历放入栈中,每次判断栈顶元素是否大于当前元素,大于则直接入栈,小于证明该元素为第一个大于栈顶元素的数字,存储该下标。这个存储的下标数组即为最终结果。

源码:

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        stack<int> s;
        vector<int>result(nums1.size(), -1);
        unordered_map<int, int> map;
        for (int i = 0; i < nums1.size(); i++) {
            map[nums1[i]] = i;
        }
        s.push(0);
        for (int i = 1; i < nums2.size(); i++) {
            while (!s.empty() && nums2[s.top()] < nums2[i]) {
                if (map.count(nums2[s.top()]) > 0) {
                    result[map[nums2[s.top()]]] = nums2[i];
                }
                s.pop();
            }
            s.push(i);
        }
        return result;
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值