class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
stack<int> st;
st.push(0);
vector<int> result(nums.size(),-1);
for(int i=1;i<nums.size()*2;i++){
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;
}
};
这个题还是比较坑的 主要是你得能想到循环就是两次遍历就可以了 然后就是用%的操作 来保证两次都是一样的 类比54321 54321 这样第二个5就能把4321都涵盖了
一定要用空间换时间的思想!!!
class Solution {
public:
int trap(vector<int>& height) {
int result=0;
if(height.size()<=2) return 0;
vector <int> maxleft (height.size(),0);
vector <int> maxright (height.size(),0);
maxleft[0]=height[0];
maxright[height.size()-1] = height[height.size()-1];
for(int i=1;i<height.size();i++){
maxleft[i]=max(maxleft[i-1],height[i-1]);
}
for(int i=height.size()-2;i>=0;i--){
maxright[i]=max(maxright[i+1],height[i+1]);
}
for(int i=0;i<height.size();i++){
int count =min(maxleft[i],maxright[i])-height[i];
if(count>0) result+=count;
}
return result;
}
};
双指针法 完全没问题 还是说:练的不够啊 力量不够啊