• 503. 下一个更大元素 II (暴力、单调栈)


    题目:

    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。

    示例 1:

    输入: [1,2,1]
    输出: [2,-1,2]
    解释: 第一个 1 的下一个更大的数是 2;
    数字 2 找不到下一个更大的数;
    第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
    注意: 输入数组的长度不会超过 10000。

    方法一:遍历每一个数,在这个数的后面找到比它大的数,如果到达数组边界,则重头开始寻找,没有的话返回-1;

     1 class Solution {
     2 public:
     3     vector<int> nextGreaterElements(vector<int>& nums) {
     4         int max = 0;
     5         vector<int> max_(nums.size());
     6         for(int i = 0; i < nums.size(); i++){
     7             max_[i] = nextMax(nums,i);
     8         }
     9         return max_;
    10 
    11     }
    12 
    13     int nextMax(vector<int>& nums,int now){
    14         for(int i = now+1; i < nums.size();i++)
    15             if(nums[i] > nums[now]) return nums[i];
    16         for(int i = 0; i < now; i++)
    17             if(nums[i] > nums[now])return nums[i];
    18 
    19         return -1;
    20     }
    21 };

    方法二:单调栈

    建立一个记录 还没有找到后续更大数 的栈 s

    1. 每当遍历到一个新数时,用它来和之前栈顶数比较,如果比栈顶数小(>=) ,意味着比栈中的所有数都小(>=),则新数入栈;

      如果比栈顶数大,即找到栈顶数的后续第一个更大数,栈顶弹出,新数再与新栈顶比较。

    遍历了一遍之后,更大数的位序>原数的位序 的情况没了,现在就剩下,更大数的位序<原数 和 不存在更大数了;

    2. 再重头遍历一遍,但是这个时候已经没有新数了,所以不存在新数入栈。

        如果比栈顶数大,即找到栈顶数的后续第一个更大数,栈顶弹出,新数再与新栈顶比较。

        遍历了一遍之后,现在就剩下,不存在更大数了;

    3. 把栈中剩下的数的最大数都设为-1;

    另外,为方便记录,栈中仅存放数的位序。

     1 class Solution {
     2 public:
     3     vector<int> nextGreaterElements(vector<int>& nums) {
     4         
     5         vector<int> max_(nums.size());
     6         if(nums.size()==0) return max_;
     7         stack< int > s;
     8         
     9         for(int i = 0; i < nums.size(); i++){
    10             while(!s.empty() && nums[i] > nums[s.top()]) {
    11                 max_[s.top()] = nums[i];
    12                 s.pop();             
    13             }
    14             s.push(i);
    15         }
    16         for(int i = 0; i < nums.size(); i++){
    17             while(!s.empty() && nums[i] > nums[s.top()]) {
    18                 max_[s.top()] = nums[i];
    19                 s.pop();             
    20             }
    21         }
    22         while(!s.empty()){
    23             max_[s.top()] = -1;
    24             s.pop();
    25         }
    26         return max_;
    27     }
    28 };
  • 相关阅读:
    MySQL ——索引原理与慢查询优化(Day45)
    mysql 练习题(Day44)
    MySQL 多表查询(Day43)
    MySQL 单表查询(Day42)
    MySQL -表完整性约束(Day41)
    回调函数
    进程池
    共享数据, 信号量(了解),事件(了解)
    管道
    python并发编程之多进程
  • 原文地址:https://www.cnblogs.com/mujin-chuyang/p/13897616.html
Copyright © 2020-2023  润新知