单调栈01
单调栈
739.每日温度
这里用下标进栈,解决日期问题。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> answer(n, 0);
stack<int> st;
st.push(0);
for(int i = 1; i < n; i++)
{
while(!st.empty() && temperatures[i] > temperatures[st.top()] )
{
int j = st.top();
st.pop();
answer[j] = i - j;
}
st.push(i);
}
return answer;
}
};
496.下一个更大元素 I
暴力法:
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
int n1 = nums1.size();
int n2 = nums2.size();
vector<int> answer(n1, 0);
for(int i = 0; i < n1; i++)
{
int j = 0;
while(j < n2 && nums2[j] != nums1[i])
{
j++;
}
while(j < n2 && nums2[j] <= nums1[i])
{
j++;
}
if(j == n2)
answer[i] = -1;
else
answer[i] = nums2[j];
}
return answer;
}
};
单调栈:
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> st;
vector<int> result(nums1.size(), -1);
if (nums1.size() == 0) return result;
unordered_map<int, int> umap; // key:下标元素,value:下标
for (int i = 0; i < nums1.size(); i++) {
umap[nums1[i]] = i;
}
st.push(0);
for (int i = 1; i < nums2.size(); i++) {
if (nums2[i] < nums2[st.top()]) { // 情况一
st.push(i);
} else if (nums2[i] == nums2[st.top()]) { // 情况二
st.push(i);
} else { // 情况三
while (!st.empty() && nums2[i] > nums2[st.top()]) {
if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素
int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标
result[index] = nums2[i];
}
st.pop();
}
st.push(i);
}
}
return result;
}
};
503.下一个更大元素II
与739相同
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
vector<int> answer(n, -1);
stack<int> st;
st.push(0);
for(int i = 1; i < 2 * n - 1 ; i++)
{
cout << i << " ";
while(!st.empty() && nums[st.top()] < nums[i % n])
{
int j = st.top();
answer[j] = nums[i % n];
st.pop();
}
st.push(i % n);
}
return answer;
}
};

浙公网安备 33010602011771号