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; } }