496. 下一个更大元素 I
预处理nums2,用一个单调栈来处理nums2。
如果遍历到的值比栈顶大,那么我们直接将栈顶弹出。
如果遍历到的值比栈顶小,那么此时的栈顶元素一定就是我们要找的第一个比遍历值大的数。
然后再用一个哈希表来存放每个nums2中的值的右边第一个大于它的数。
如果栈中有,就直接存,如果没有,就把该遍历元素存为 -1即可。
最后将当前遍历到的数压入栈中即可。
然后我们直接遍历一遍nums1就可以了。
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> ke;
stack<int> st; st.push(-1);
for(int i = nums2.size() - 1; i >= 0; -- i)
{
while(st.size()){
if(st.top() < nums2[i]) st.pop();
else break;
}
if(st.size()) ke[nums2[i]] = st.top();
else ke[nums2[i]] = -1;
st.push(nums2[i]);
}
for(int i = 0; i < nums1.size(); ++ i)
nums1[i] = ke[nums1[i]];
return nums1;
}
};
856. 括号的分数
如果是嵌套括号,得分要乘二
如果是并列,得分相加
结合前一个括号就能很容易判断,如果 前面是 , 即 , 那毫无疑问是并列的)(()
如果 前面还是 , 即 , 那自然是嵌套的))...))
再将每层的分数叠加到栈顶,最后得分就是题目所求
class Solution {
public:
int scoreOfParentheses(string s) {
int ans = 0, pre = ')';
vector<int> st;
for (char c: s) {
if (c == '(') st.push_back(0);
else {
int cur = st.back(); st.pop_back();
if (pre == '(') cur++;
else cur *= 2;
if (st.empty()) ans += cur;
else {
st[st.size() - 1] += cur;
}
}
pre = c;
}
return ans;
}
};
739.每日温度
首先我们定义一个堆栈来储存下标(因为这样可以直接计算出天数差),接着只要当前的温度大于栈中最上面的温度就出栈,而当前下标减掉对应温度的下标即是天数差 最后我们将栈中剩余的下标全部赋零,因为他们后面都没有比他们大的温度了
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n=temperatures.size();
stack<int> st;
st.push(0);
for(int i=1;i<n;i++){
while(!st.empty()&&temperatures[i]>temperatures[st.top()]){
temperatures[(int)st.top()]=i-(st.top());
st.pop();
}
st.push(i);
}
while(!st.empty()){
temperatures[st.top()]=0;
st.pop();
}
return temperatures;
}
};
20. 有效的括号
先判断字符串长度是否为偶数然后把左括号压入栈中再看右括号能不能适配,如果不能适配或者没有左括号则返回false,遍历结束后如果没有左括号了,返回true。
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if (n % 2 == 1)
{
return false;
}
map<char, char> pairs =
{
{')', '('},
{']', '['},
{'}', '{'}
};
stack<char> stk;
for (char ch: s)
{
if (pairs.count(ch))
{
if (stk.empty() || stk.top() != pairs[ch])
{
return false;
}
stk.pop();
}
else
{
stk.push(ch);
}
}
return stk.empty();
}
};