題目描述:
給定一個循環數組(最後一個元素的下一個元素是數組的第一個元素),輸出每個元素的下一個更大元素。數字 x 的下一個更大的元素是按數組遍歷順序,這個數字之後的第一個比它更大的數,這意味着你應該循環地搜索它的下一個更大的數。如果不存在,則輸出 -1。
輸入輸出樣例:
示例 1:
輸入: [1,2,1]
輸出: [2,-1,2]
解釋: 第一個 1 的下一個更大的數是 2;
數字 2 找不到下一個更大的數;
第二個 1 的下一個最大的數需要循環搜索,結果也是 2。
注意: 輸入數組的長度不會超過 10000。
思路:
題目很簡單,就是將要判斷的的值放在一個容器裏面,然後遍歷數組對容器中的值全部進行判斷,達成條件後將判斷值從容器取出,判斷完後將當前指向的數組元素放入容器,因容器中大一點的值遇到的第一個更大的值不一定是小一點的值遇到的第一個更大值,故採用單調棧來求解。
以下爲代碼:
class Solution
{
public:
vector<int> nextGreaterElements(vector<int>& nums)
{
stack<int> s;
int n=nums.size();
vector<int> ans(n,-1);
for(int i=0;i<n*2;i++)
{
while((!s.empty())&&(nums[s.top()]<nums[i%n]))
{
ans[s.top()]=nums[i%n];
s.pop();
}
if(i<n) s.push(i);
}
return ans;
}
};
總結:題目沒太多好說的,但是代碼太久沒寫了很多細節都忘了,這裏稍微記錄以下。
vector常用用法:頭文件#include<vector>
新建時初始化:
vector<int> ivec(10,-1);//10和int元素,每個都初始化爲-1
vector<int> ivec1(10);//10個int元素,每個初始化爲0
常用操作:
v.empty();//檢查是否爲空
v.capacity();//返回當前vector中最大可以存儲數據的容量
v.size();//返回v中元素的個數
v[n];//獲取v中第n個元素
v.push_back(x);//添加元素x
stack棧的常用用法:頭文件#include<stack>
常用操作:
s.push();//向棧內壓入一個成員;
s.pop();//從棧頂彈出一個成員(與jave不一樣,沒有返回值);
s.empty();//如果棧爲空返回true,否則返回false;
s.top();//返回棧頂,但不刪除成員;
s.size();//返回棧內元素的大小;