下一个更大元素 I(Next Greater Element I)

LeetCode

下一个更大元素 I

给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。

示例 1:

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

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

​ nums1和nums2中所有元素是唯一的。
​ nums1和nums2 的数组大小都不超过1000。

for(n:nums1)——指的是遍历nums中的值。

1. 暴力解法:

最简单的办法就是对于nums1中的每一个元素,首先找到其在nums2中所在的位置。然后在nums2中从该位置+1开始往后依次判断,看是否有比该数大的元素,如果有就将这个数放入定义的vector中,没有就在vector中加入-1。

class Solution(){
  public:
  	vector<int> nextGreatElement(vector<int>& nums1, vector<int>& nums2){
      vector<int> res;
      for(int n:nums1){
        int i = 0;
        while(nums2[i] != n){
          i++;
        }
        i++;
        for(;i<nums2.size();i++){
          if(nums2[i] > n){
            res.push_back(nums2[i]);
            break;
          }
        }
        if(i == nums2.size()){
          res.push_back(-1);
        }
      }
      return res;
    }
};

2. 单调栈:

这道题出现在使用栈来解决的题目范围,所以得使用到栈。

对于nums2中的元素,构造一个单调不增的栈。

依次扫描nums2中的元素,如果扫描到第i位后,发现当前的栈顶元素小于第i位的值,那么就意味着栈顶元素找到了下一个比其大的值。接下来要做的就是将其记录到一个哈希表中,值就是对应的元素值,索引是栈顶元素的值。如果不如栈顶元素大,那么直接入栈。扫描完nums2,那么留在栈中的元素都是在其右边没有比它的的数据存在的元素。这样的数据,在哈希表中的值均设置为-1,索引是栈顶元素的值。最后,对于nums1来讲,利用其所有元素作为索引,可以在哈希表中依次找到对应的下一个更大元素。

class Solution(){
  public:
  	vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2){
      vector<int> res;
      unordered_map<int, int> map;
      stack<int> s1;
      for(int n:nums2){
        while(!s1.empty() && s1.top() < n){
          mp[s1.top] = n;
          s1.pop();
        }
        s1.push(n);
      }
      while(!s1.empty()){
        mp[s1.top()] = -1;
        s1.pop();
      }
      for(int n:nums1){
        res.push_back(mp[n]);
      }
      return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值