【牛客面试必刷TOP101】有效括号序列、滑动窗口的最大值

BM44 有效括号序列

点击进入该题
描述:
给出一个仅包含字符’(‘,’)‘,’{‘,’}‘,’[‘和’]',的字符串,判断给出的字符串是否是合法的括号序列。
括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。

  • 解题步骤
    1.首先读题,了解题意,它是让我们判断括号是否合法。
    2.开始做题,如果括号合法,它的数量一定是偶数(每个括号都是成对出现的),将题上给的s字符串给转化为字符数组,判断长度。
    3.之后我们借助栈来完成,我们将所有左括号都入栈,如果遇到右括号我们就看栈顶值是否与当前的左括号匹配,匹配就可以弹出(相对于验证了这个括号合法),若不匹配,可以直接返回值false.
    4.如果遍历完数组了,栈不为空,证明有不匹配的括号,直接返回栈是否为空的函数值。

答案:

import java.util.*;

public class Solution {
    
    
    /**
     * 
     * @param s string字符串 
     * @return bool布尔型
     */
    public boolean isValid (String s) {
    
    
        // write code here
        char[] cur = s.toCharArray();
        if(cur.length % 2 != 0) {
    
    
            return false;
        }
        Stack<Character> stack=new Stack<>();
        for(int i=0;i<cur.length;i++) {
    
    
            //将左括号全部入栈
            if(cur[i]=='(' || cur[i]=='{' || cur[i]=='[') {
    
    
                stack.push(cur[i]);
            //如果栈顶的值与目前的元素匹配,弹出
            //如果不匹配,直接返回false
            }else if(cur[i]==')' && !stack.isEmpty() && stack.peek()=='(') {
    
    
                stack.pop();
            }else if(cur[i]=='}' && !stack.isEmpty() && stack.peek()=='{') {
    
    
                stack.pop();
            }else if(cur[i]==']' && !stack.isEmpty() && stack.peek()=='[') {
    
    
                stack.pop();
            }else {
    
    
                return false;
            }
        }
        return stack.isEmpty();
    }
}

BM45 滑动窗口的最大值

点击进入该题
描述:
给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。

例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

窗口大于数组长度或窗口长度为0的时候,返回空。

  • 解题思路
    1.我们使用双指针的思想
    2.构建一个新的函数,用于判断滑块的最大值。
    3.我们使用变量,lr来控制滑块的大小,每次都将滑块中最大的返回,并且添加到ret中。

图片中每次短暂暂停就是一组数据:
在这里插入图片描述

答案

import java.util.*;
public class Solution {
    
    
    public ArrayList<Integer> maxInWindows(int [] num, int size) {
    
    
        //记录每组最大值
        ArrayList<Integer> ret = new ArrayList<>();
        //判断特殊情况
        if (num.length < size || num.length == 0 ||size==0) {
    
    
            return ret;
        }
        //双指针思想
        //每次截取size长度的数组传入到getMax()函数中,用来判断长度
        for (int i = size; i <= num.length; i++) {
    
    
            int tmp = getMax(num, (i - size), i);
            ret.add(tmp);
        }
        return ret;
    }
    private int getMax(int[] arr, int l, int r) {
    
    
        int max = 0;
        for (int j = l; j < r; j++) {
    
    
            if (max < arr[j]) {
    
    
                max = arr[j];
            }
        }
        return max;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_65228171/article/details/130587287
今日推荐