倒计时day2!!第一题是下一个更大元素IIhttps://leetcode.cn/problems/next-greater-element-ii/本题和刷过的每日温度如出一撤,不过是搞点花样,把数组弄成循环遍历的了。学过数据结构的朋友都知道循环队列,用取模运算表示循环过程,套到这里就行了。
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
vector<int> result(nums.size(), -1);
if (nums.size() == 0) return result;
stack<int> st;
st.push(0);
for (int i = 1; i < nums.size() * 2; i++){
if (nums[i % nums.size()] < nums[st.top()])
st.push (i % nums.size());
else if (nums[i % nums.size()] == nums[st.top()]) st.push(i % nums.size());
else {
while(!st.empty() && nums[i % nums.size()] > nums[st.top()]){
result[st.top()] = nums[i % nums.size()];
st.pop();
}
st.push(i % nums.size());
}
}
return result;
}
};
第二题是接雨水https://leetcode.cn/problems/trapping-rain-water/description/,通过单调栈确定左边和右边第一个比当前元素大或者小的元素值,若遍历发现当前元素值大于栈顶元素值,说明凹槽出现,可以承接雨水了。当遍历发现元素值相同时,更新栈顶元素,
class Solution {
public:
int trap(vector<int>& height) {
if (height.size() <= 2) return 0;
stack<int> st;
st.push(0);
int sum = 0;
for (int i = 1; i < height.size(); i++){
if (height[i] < height[st.top()])
st.push(i);
if (height[i] == height[st.top()]){
st.pop();
st.push(i);
}
else{
while(!st.empty() && height[i] > height[st.top()]){
int mid = st.top();
st.pop();
if (!st.empty()){
int h = min(height[st.top()], height[i]) - height[mid];
int w = i - st.top() - 1;
sum += h * w;
}
}
st.push(i);
}
}
return sum;
}
};
说实话,接雨水这个确实没太搞懂,只能二刷的时候再体会一下了。