美文网首页LeetCode蹂躏集
2018-05-30 496. Next Greater Ele

2018-05-30 496. Next Greater Ele

作者: alexsssu | 来源:发表于2018-05-30 18:23 被阅读0次

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


    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;
        }
    };
    

    相关文章

      网友评论

        本文标题:2018-05-30 496. Next Greater Ele

        本文链接:https://www.haomeiwen.com/subject/utexsftx.html