下一个大数的问题

问题来源:

点击打开链接


问题描述:

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.
我的解决方案:

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
        vector<int> ret;
        for(int i=0;i<findNums.size();++i)
        {
            int tmp=-1;
            bool find=false;
            for(int j=0;j<nums.size() && tmp==-1;++j)
            {
                if(findNums[i]==nums[j])
                   find=true;
                if(find && findNums[i]<nums[j])
                    tmp=nums[j];
            }
            ret.push_back(tmp);
        }
        return ret;
    }
};

思考:

题目挺简单的,双重循环来找右边第二大的数,这个思路很容易想到.不过缺点也是显而易见的,每一个数都需要循环才能找到在第二个数组中的位置,时间复杂性很糟糕.有些循环是没有多余的,因此优化的思路可以考虑用空间换时间.采用一个map来记录数组二中每个元素和他右边第一个比他大的元素的对应关系.那么对于数组一,只需要在map中进行寻找即可.构造map的时候,也需要双重循环,但是内层循环可以从每次的元素之后开始循环,时间复杂度可以降低为O(log2n)

以下是自己优化后的代码:

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
        vector<int> ret;
        unordered_map<int,int> m;
        for(int i=0;i<nums.size();++i)
            for(int j=i;j<nums.size();++j)
                if(nums[i]<nums[j])
                {
                    m[nums[i]]=nums[j];
                    break;
                }
        for(int i=0;i<findNums.size();++i)
          ret.push_back(m.count(findNums[i])?m[findNums[i]]:-1);
        return ret;
    }
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值