找下一个更大元素

给定两个没有重复元素的数组munsSubnumsAll,其中numsSubnumsAll的子集。找到numsSub中的每个元素在numsAll中的下一个比其大的元素。比如,numsSub中的一个元素x在numsAll中的下一个比其大的元素是指,x在numsAll中位置开始,下一个序号比其大值也比其大的第一个元素。如果不存在这个一个比其大的元素,则输出结果为-1。

示例:

numsSub = {4, 1, 2};
numsAll = {1, 3, 4, 2};
结果为:{-1, 3, -1};

numsSub = {4, 2, 9}
numsAll = {5, 4, 8, 2, 9, 7, 3};
结果为:{8, 9, -1};

代码:

int main(int argc, char *argv[]) {
    int numsSub[] = {4, 1, 2};
    int numsAll[] = {1, 3, 4, 2};
    std::stack<int> s;
    std::unordered_map<int, int> nextBigger;
    for (int i = 0; i < (sizeof(numsAll)/sizeof(numsAll[0])); ++i) {
        while(!s.empty() && numsAll[i] > s.top()) {
            nextBigger[s.top()] = numsAll[i];
            s.pop();
        } 
        s.push(numsAll[i]);
    }

    int bigger = -1;
    for (int i = 0; i < (sizeof(numsSub)/sizeof(numsSub[0])); ++i) {
        auto it = nextBigger.find(numsSub[i]);
        if (it == nextBigger.end()) {
            bigger = -1;
        } else {
            bigger = it->second;
        }
        std::cout << numsSub[i] << " next bigger number is: " << bigger << std::endl;
    }
}
posted @ 2019-08-12 20:31  情敌贝多芬  阅读(124)  评论(0编辑  收藏  举报