LeetCode 热题 100 —— 有效的括号(栈) + 买卖股票的最佳时机(贪心算法)

目录

20. 有效的括号 简单

贪心算法

121. 买卖股票的最佳时机 简单


20. 有效的括号 简单

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。

  2. 左括号必须以正确的顺序闭合。

  3. 每个右括号都有一个对应的相同类型的左括号。

示例 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员合理

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值