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

简介: 【牛客面试必刷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.我们使用变量,l、r来控制滑块的大小,每次都将滑块中最大的返回,并且添加到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;
    }
}
相关文章
|
6月前
|
存储 算法 编译器
米哈游面试算法题:有效的括号
米哈游面试算法题:有效的括号
76 0
|
存储
【栈与队列面试题】有效的括号(动图演示)
【栈与队列面试题】有效的括号(动图演示)
【面试必刷TOP101】寻找峰值 & 数组中的逆序对
【面试必刷TOP101】寻找峰值 & 数组中的逆序对
58 0
|
算法 C++
【面试必刷TOP101】二分查找-I & 二维数组中的查找
【面试必刷TOP101】二分查找-I & 二维数组中的查找
51 0
【面试必刷TOP101】删除链表的倒数第n个节点 & 两个链表的第一个公共结点
【面试必刷TOP101】删除链表的倒数第n个节点 & 两个链表的第一个公共结点
49 0
|
测试技术
【面试必刷TOP101】合并k个已排序的链表 & 判断链表中是否有环
【面试必刷TOP101】合并k个已排序的链表 & 判断链表中是否有环
71 0
【面试必刷TOP101】反转链表 & 链表内指定区间反转
【面试必刷TOP101】反转链表 & 链表内指定区间反转
59 0
|
3月前
|
存储 算法 索引
【面试题】最长有效括号
【面试题】最长有效括号
43 0
|
4月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
6月前
|
算法
面试题 08.09:括号
面试题 08.09:括号
26 0