LeetCode OJ 496. Next Greater Element I

LeetCode OJ 496. Next Greater Element I


Description

You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset of nums2. Find all the next greater numbers for nums1’s elements in the corresponding places of nums2.

The Next Greater Number of a number x in nums1 is the first greater number to its right in nums2. If it does not exist, output -1 for this number.

Example 1

Input: nums1 = [4,1,2], nums2 = [1,3,4,2].
Output: [-1,3,-1]
Explanation:
For number 4 in the first array, you cannot find the next greater number for it in the second array, so output -1.
For number 1 in the first array, the next greater number for it in the second array is 3.
For number 2 in the first array, there is no next greater number for it in the second array, so output -1.

Example 2

Input: nums1 = [2,4], nums2 = [1,2,3,4].
Output: [3,-1]
Explanation:
For number 2 in the first array, the next greater number for it in the second array is 3.
For number 4 in the first array, there is no next greater number for it in the second array, so output -1.

Note:

  1. All elements in nums1 and nums2 are unique.
  2. The length of both nums1 and nums2 would not exceed 1000.

方法一

搜索:对于nums1中的每一个数,用C++内置find函数找到它在nums2中的位置,并往后找第一个大于它的数,如果找到就存到结果数组中,否则存-1。

代码


class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
        vector<int> ans;
        if(findNums.size() == 0 || nums.size() == 0)
            return ans;
        for(int i = 0 ; i < findNums.size(); i++){
            auto itr = find(nums.begin(), nums.end(), findNums[i]);
            if(itr == nums.end())
                ans.push_back(-1);
            else{
                for(itr;itr != nums.end(); itr++){
                    if(*itr > findNums[i]){
                        ans.push_back(*itr);
                        break;
                    }
                }
                if(itr == nums.end())
                    ans.push_back(-1);
            }
        }
        return ans;
    }
};

方法二

使用stack和unordered_map<key, value>:对于nums2中的每一个数,存到stack中。如果某个数大于stack的栈顶元素,则这个数是nums2中大于栈顶的第一个数,保存这一对数到unordered_map中,然后栈顶元素出栈。循环做这样的操作,直到栈顶元素不大于这个数。遍历完nums2中的所有数。
对于nums1中的每一个数,在刚才保存的unordered_map<key, value>中搜索,如果有这样的key值,则将对应的value保存到结果数组中。

代码

个人github代码链接


class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
        vector<int> ans;
        stack<int> s;
        unordered_map<int,int> m;
        for(int num: nums){
            while(!s.empty() && s.top() < num){
                m[s.top()] = num;
                s.pop();            //这一步很关键
            }
            s.push(num);
        }
        for(int num: findNums){
            if(m.count(num))    ans.push_back(m[num]);
            else    ans.push_back(-1);
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值