目录
栈
20. 有效的括号 简单
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
-
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([])"
输出:true
提示:
-
1 <= s.length <= 104
-
s
仅由括号'()[]{}'
组成
//方法:栈+哈希表
//快速排除:如果字符串长度为奇数,直接返回false,因为有效括号对必须是偶数长度。
//映射关系:使用哈希表存储右括号到左括号的映射(如')' → '(')。
//栈的应用:遍历字符串,遇到左括号时入栈,遇到右括号时检查栈顶元素是否匹配,匹配则弹出栈顶,否则返回false。
class Solution {
public:
bool isValid(string s) {
//计算字符串长度n,若为奇数直接返回false。
int n = s.size();
if (n % 2 == 1) {
return false;
}
//pairs哈希表存储右括号到左括号的映射。
unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};
//stk栈用于存储左括号。
stack<char> stk;
for (char ch: s) {
//unordered_map::count(key):检查哈希表中是否存在键 key
//pairs 是一个哈希表,键为右括号(), ], }),值为对应的左括号((, [, {)。
//遇到右括号(pairs.count(ch)为真)
if (pairs.count(ch)) {
//若栈为空(无左括号匹配)或栈顶左括号不匹配,返回false。
if (stk.empty() || stk.top() != pairs[ch]) {
return false;
}
stk.pop();
}
//遇到左括号:直接入栈。
else {
stk.push(ch);
}
}
return stk.empty();
}
};
贪心算法
121. 买卖股票的最佳时机 简单
给定一个数组 prices
,它的第 i
个元素 prices[i]
表示一支给定股票第 i
天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
。
示例 1:
输入:[7,1,5,3,6,4] 输出:5 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
输入:prices = [7,6,4,3,1] 输出:0 解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
提示:
-
1 <= prices.length <= 105
-
0 <= prices[i] <= 104