LeetCode蹂躏集

2018-05-30 496. Next Greater Ele

2018-05-30  本文已影响0人  alexsssu

题意:给你两个数组,找出数组一中所有的元素,在第二个数组中对应位置右边第一个比该数大的数。


QQ截图20180530180803.png

第一个数组中元素“4”,在第二个数组中“4”的右边只有元素2,所以不存在右边比该数大的第一个数,返回-1。元素“1”,在第二个数组中“1”的右边第一个比“1”大的数是3,返回3。直到对数组一所有元素都做完操作,返回该vector。

解题思路:
方法一:如果两个数组规模不大,可以使用两层循环,暴力寻找。
时间复杂度:O(n^2)

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
        vector<int> ans;
        int n;
        int i,j,k;
        for(i = 0; i < findNums.size(); i++){
            for(j = 0; j < nums.size(); j++){
                if(findNums[i] == nums[j])
                    break;
            }
            for(k = j + 1; k < nums.size(); k++){
                if(nums[k] > findNums[i])
                    break;
            }
            if(k < nums.size())
                ans.push_back(nums[k]);
            else ans.push_back(-1);
        }
        return ans;
    }
};

方法二:使用栈存储数组二中的元素递增序列,然后使用哈希表在遍历数组二的时候将元素右边第一个比该数大的元素存储起来。

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
        stack<int> ss;
        map<int, int> imap;
        for(int i = 0; i < nums.size(); i++){
            while(ss.size() && ss.top() < nums[i]){
                imap[ss.top()] = nums[i];
                ss.pop();
            }
            ss.push(nums[i]);
        }

        vector<int> ans;
        for(int i = 0; i < findNums.size(); i++)
            ans.push_back(imap.count(findNums[i]) ? imap[findNums[i]] : -1);
        return ans;
    }
};
上一篇下一篇

猜你喜欢

热点阅读