Leetcode刷题52-496. 下一个更大元素 I(C++详细解法!!!)

题目来源:链接: [https://leetcode-cn.com/problems/next-greater-element-i/]

1.问题描述

给定两个没有重复元素的数组 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。

注意事项:

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

2.我的解决方案

easy 类型题目。不多BB.

我的AC代码:

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int> res;
        for(auto c : nums1)
        {
            vector<int>::iterator iter = find(nums2.begin(), nums2.end(), c);
            for(iter=iter+1; iter != nums2.end(); ++iter)
            {
                if(*iter > c)
                {
                    res.push_back(*iter);
                    break;
                }
            }
            if(*(iter-1) <= c && iter == nums2.end())
            {
                res.push_back(-1);
            }
        }
        return res;
    }
};

3.大神们的解决方案

用时最短的:8ms
通过map 解决。
思路如下:

  1. 先遍历大数组nums2,首先将第一个元素入栈;
  2. 继续遍历,当当前元素小于栈顶元素时,继续将它入栈;当当前元素大于栈顶元素时,栈顶元素出栈,此时应将该出栈的元素与当前元素形成key-value键值对,存入Map中;
  3. 当遍历完nums2后,得到nums2中元素所对应的下一个更大元素的Map表;
  4. 遍历nums1的元素在Map中去查找‘下一个更大元素’,当找不到时则为-1。
class Solution {
public:
    vector<int> nextGreaterElement(vector<int> &findNums, vector<int> &nums) {
        int size = nums.size();
        vector<int> greater(size, -1);//先初始化成-1 将nums2中的元素与下一个更大元素关联
        unordered_map<int, int> val_to_idx;
        stack<int> stk;
        //寻找nums2中各个元素的下一个更大的元素,并将 这两个 元素进行关联
        for (int i = 0; i < size; ++i) {
            val_to_idx[nums[i]] = i;
            while (stk.size() && nums[stk.top()] < nums[i]) {
                greater[stk.top()] = nums[i];
                stk.pop();
            }
            stk.push(i);
        }
        vector<int> ans;
        //开始寻找nums1各个元素x在nums2中第一个比 x 大的元素
        for (int num: findNums) {
            ans.push_back(greater[val_to_idx[num]]);
        }
        return ans;
    }
};

4.我的收获

继续熟悉 C++的标准库 函数,是个好东西。。。
map 和 find 函数
1.C++ find()函数用法(一般用于vector的查找)[https://blog.csdn.net/zhangweijiqn/article/details/9107571]
2.C++ STL容器之 map
[https://www.cnblogs.com/yutongzhu/p/5884269.html]
2019/4/11 胡云层 于南京 52

猜你喜欢

转载自blog.csdn.net/qq_40858438/article/details/89203277