包含min函数的栈

需要O(1)时间求出最小值。如果换成最大值,那就和“滑动窗口的最大值”一题思路差不多了。

用一个栈保存元素,用另一个栈来存储最小值,如果新增的元素比栈顶元素小则压入,否则不压入。

如果检测到第一个栈把最小元素弹出了,那么另一个栈也弹出栈顶元素。

“滑动窗口的最大值”更加复杂一点,而且是用deque保存最大值,如果新增的元素比deque中某些元素大,那么必须把小的元素都去除,然后在deque尾部加入这个新元素。

这里附上“滑动窗口的最大值”的代码。

 1 class Solution {
 2 public:
 3     vector<int> maxInWindows(const vector<int>& num, unsigned int size)
 4     {
 5         deque<int> id;
 6         vector<int> record;
 7         if(num.size()==0||size==0||size>num.size())
 8             return record;
 9         for(int i=0;i<size;i++)
10         {
11             while(!id.empty())
12             {
13                 if(id.back()<num[i])
14                     id.pop_back();
15                 else
16                     break;
17                }
18                id.push_back(num[i]);
19         }
20         record.push_back(id.front());
21         if(size<num.size())
22         {      
23             int rear=size;
24             int front=0;
25             while(rear<num.size())
26             {
27                 if(id.front()==num[front])
28                     id.pop_front();
29                 while(!id.empty())
30                 {
31                     if(id.back()<num[rear])
32                         id.pop_back();
33                     else
34                         break;
35                 }
36                 id.push_back(num[rear]);
37                 record.push_back(id.front());
38                 front++;
39                 rear++;
40             }
41         }
42         return record;
43     }
44 };
View Code

 

posted @ 2016-03-29 22:35  vaevaevae  阅读(140)  评论(0编辑  收藏  举报