网站首页> 文章专栏> 【字节百度笔试】整理两道LeetCode题【栈的应用】
【字节百度笔试】整理两道LeetCode题【栈的应用】
路人王 天津 2021-08-12 159 0 0

一、1190. 反转每对括号间的子串

给出一个字符串 s(仅含有小写英文字母和括号)。  
请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。  
注意,您的结果中 不应 包含任何括号。  

 示例 1:  
输入:s = "(abcd)"  
输出:"dcba"  
示例 2:  
输入:s = "(u(love)i)"  
输出:"iloveu"  
解释:先反转子字符串 "love" ,然后反转整个字符串。  

思路:遇到( 还有字符直接入栈,遇到第一个),进行出战操作并进行反转字符串操作

class Solution {
    public String reverseParentheses(String s) {
        Stack<String> stack=new Stack<String>();
        StringBuilder str = new StringBuilder();
        for(char c : s.toCharArray()){
            if(c=='('){
                stack.push(str.toString());
                str = new StringBuilder();
            }else if(c==')'){
                str = new StringBuilder(stack.pop() + str.reverse());
            }else{
                str.append(c);
            }
        }
        return str.toString();
    }
}

二、单调栈 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
在这里插入图片描述

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

这倒题还是一个没有想出来的状态只是单单实现了暴力的解法,看到官网上有很多方法。
暴力解法。
思路遍历每一个数组下标,并向左和向右进行遍历,将两边最大高度的较小值减去当前高度的值

class Solution {
    public int trap(int[] height) {
        int ans = 0;
        int size = height.length;
        for (int i = 1; i < size - 1; i++) {
            int max_left = 0, max_right = 0;
            for (int j = i; j >= 0; j--) {
                max_left = Math.max(max_left, height[j]);
            }
            for (int j = i; j < size; j++) {
                max_right = Math.max(max_right, height[j]);
            }
            ans += Math.min(max_left, max_right) - height[i];
        }
        return ans;
    }
}

这样时间复杂赴会很高,双层For循环,On2

java  

评论

评论  分享  打赏