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