P3【力扣20,496】【数据结构】【栈Stack】C++版

 【20】有效的括号

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成
class Solution {
public:
    bool isValid(string s) {
       stack<char> Stack;
       Stack.push('0');
       for(int i = 0; i < s.size(); i++){
            if(Stack.top() == '(' && s[i] == ')' 
            || Stack.top() == '[' && s[i] == ']' 
            || Stack.top() == '{' && s[i] == '}'){
                Stack.pop();
            }else{
                Stack.push(s[i]);
            }
       }
        if(Stack.top() == '0'){
            return true;
        }else{
            return false;
        }
    }
};

思路:

从零开始遍历每个字符并判断该字符与栈顶元素是否括号对应,如果是则弹出栈顶元素,否则存放到栈。

复杂度分析:

时间复杂度:O(N) 

空间复杂度:O(N)

【496】下一个更大的元素

nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。

示例 1:

输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。

示例 2:

输入:nums1 = [2,4], nums2 = [1,2,3,4].
输出:[3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
- 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。

提示:

  • 1 <= nums1.length <= nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 104
  • nums1nums2中所有整数 互不相同
  • nums1 中的所有整数同样出现在 nums2 中
class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        queue<int> Queue;
        stack<int> Stack;
        vector<int> currMaxNum;
        int len1 = nums1.size();
        int len2 = nums2.size();

        for(int i = 0; i < len1; i++){
            Queue.push(nums1[i]);
        }
        for(int i = 0; i < len2; i++){
            Stack.push(nums2[i]);
        }
        while(!Queue.empty()){
            stack<int> temp = Stack;
            int curMax = -1;
            while(!temp.empty()){
                if(Queue.front() < temp.top()){
                    curMax = temp.top();
                }
                if(Queue.front() == temp.top()){
                    currMaxNum.push_back(curMax);
                    break;
                }
                temp.pop();
            }
            Queue.pop();
        }
        return currMaxNum;
    }
};

time:30

思路:

1.将num1存放到队列,num2存放在栈。创建currMaxNum容器来存放num1中更大的元素;

2.从队列取出队头元素,与栈顶元素对比,当栈顶元素大于对头元素,将栈顶元素存放在curMax,然后弹出栈顶元素。继续比较,只要栈顶元素大于队头元素,就更新curMax,直到栈顶元素等于对头元素;

3.将该curMax存放到currMaxNum容器中,弹出当前队头元素;

4.进行下一次循环步骤2,3,直到队列元素为空。

复杂度分析:

时间复杂度:O(N*N)

空间复杂度:O(N)

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值