需要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 };
时间: 2024-10-12 13:56:01