hot100-一刷-12栈(共5道题)
20. 有效的括号
题目描述
代码实现
分析:
代码:
class Solution {
public boolean isValid(String s) {
int n = s.length();
if(n % 2 == 1) return false;
Deque<Character> st = new LinkedList<>();
for (char c : s.toCharArray()){
if(c == '(') {
st.push(')');
}else if(c == '['){
st.push(']');
}else if(c == '{'){
st.push('}');
}else if (st.isEmpty() || st.pop() != c){
return false;
}
}
return st.isEmpty();
}
}
155. 最小栈
题目描述
pop
、top
和 getMin
操作总是在 非空栈 上调用
代码实现
分析:
代码:
class MinStack {
private Deque<int[]> st = new ArrayDeque<>();
public MinStack() {
st.push(new int[]{0, Integer.MAX_VALUE});
}
public void push(int val) {
st.push(new int[]{val, Math.min(getMin(), val)});
}
public void pop() {
st.pop();
}
public int top() {
return st.peek()[0];
}
public int getMin() {
return st.peek()[1];
}
}
394. 字符串解码
题目描述
代码实现
分析:
代码:
class Solution {
public String decodeString(String s) {
StringBuilder res = new StringBuilder();
int multi = 0;
LinkedList<Integer> stack_multi= new LinkedList<>();
LinkedList<String> stack_res= new LinkedList<>();
for (char c : s.toCharArray()){
if (c == '['){
stack_multi.addLast(multi);
stack_res.addLast(res.toString());
multi = 0;
res = new StringBuilder();
} else if (c == ']') {
StringBuilder tmp = new StringBuilder();
int cur_multi = stack_multi.removeLast();
for (int i = 0; i < cur_multi; i++){
tmp.append(res);
}
res = new StringBuilder(stack_res.removeLast() + tmp);
}else if (c >= '0' && c <='9') multi = multi * 10 + c-'0';
else res.append(c);
}
return res.toString();
}
}
739. 每日温度
题目描述
代码实现
分析:
单调栈,(相对栈顶的)下一个更大(小)的元素入栈,就弹出栈顶。继续比较。 因此,如果入栈的是元素所在数组的索引,就可以比较入栈元素和栈中元素的位置关系。如果正常的按元素自身入栈,栈经过这样之后就是呈单调的特征。
代码:
// 从左到右
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int n = temperatures.length;
int[] ans = new int[n];
Deque<Integer> st = new ArrayDeque<>();
for(int i = 0; i < n; i++){
int t = temperatures[i];
while (!st.isEmpty() && t > temperatures[st.peek()]){
// 弹出的是这一段中比temperatures[i]小的那个的索引
int j = st.pop();
// 弹出的是小的,并且知道它的索引是j, 同时现在在遍历的就是第一个比它大的,即 i
ans[j] = i - j;
}
st.push(i);
}
return ans;
}
}
// 从右到左 单调栈
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int n = temperatures.length;
int[] ans = new int[n];
Deque<Integer> st = new ArrayDeque<>();
for(int i = n-1; i >=0; i--){
int t = temperatures[i];
while (!st.isEmpty() && t >= temperatures[st.peek()]){
st.pop();
}
if(!st.isEmpty()){
ans[i] = st.peek() - i;
}
st.push(i);
}
return ans;
}
}
84. 柱状图中最大的矩形
题目描述
代码实现
分析:
代码:
class Solution {
public int largestRectangleArea(int[] heights) {
int n = heights.length;
// 每个元素的左边 第一个比该元素小 的下标
int[] left = new int[n];
Deque<Integer> st = new ArrayDeque<>();
for(int i = 0; i < n; i++){
int x = heights[i];
// <= 是因为相等的时候要替换成最右边的, 最右边的是最靠近 x 的
while(!st.isEmpty() && x <= heights[st.peek()]){
st.pop();
}
left[i] = st.isEmpty() ? -1 : st.peek();
st.push(i);
}
// 每个元素的右边 第一个比该元素小 的下标
int[] right = new int[n];
st.clear();
for (int i = n-1; i >=0; i--){
int x = heights[i];
while(!st.isEmpty() && x <= heights[st.peek()]){
st.pop();
}
right[i] = st.isEmpty() ? n : st.peek();
st.push(i);
}
int ans = 0;
for(int i = 0; i < n; i++){
int w = right[i] - left[i] -1;
int area = w * heights[i];
ans = ans > area ? ans : area;
}
return ans;
}
}
本文来自博客园,作者:chendsome,转载请注明原文链接:https://www.cnblogs.com/chendsome/p/18631673