前言
对于最近的最小最大,或是类似可转化成这种的,单调栈是一个好的贴合方法。
一、案例
二、题解
1)双指针暴力(这是一开始就从后往前的,跟直接暴力还是有思考的区别)
2)从后往前遍历,用一个单调栈维持后面的元素。
package com.xhu.offer.offerII;
import java.util.Stack;
//每日温度
public class DailyTemperatures {
//刷题除了训练问题拆解的逻辑连贯性和严谨性,还可以提高积极的动脑习惯。
public int[] dailyTemperatures(int[] temperatures) {
//从后遍历,双指针。
int len = temperatures.length;
int[] res = new int[len];
int p1 = len - 2, p2 = len - 1;
for (; p1 >= 0; p1--) {
if (temperatures[p1] < temperatures[p2]) {
res[p1] = 1;
p2 = p1;
continue;
}
for (; ++p2 < len; ) {
if (temperatures[p2] > temperatures[p1]) {
res[p1] = p2 - p1;
break;
}
}
p2 = p1;
}
return res;
}
//总结:培养好积极思考的能力,一个思考方向不行就另一个思考方向,如从左开始遍历不行,就从右试试。
public int[] dailyTemperatures2(int[] temperatures) {
//从后遍历,双指针。
int len = temperatures.length;
int[] res = new int[len];
Stack<Node> cache = new Stack<>();
cache.push(new Node(temperatures[len - 1], len - 1));
for (int i = len - 2; i >= 0; i--) {
int m = cache.peek().val;
if (m > temperatures[i]) {
res[i] = 1;
cache.push(new Node(temperatures[i], i));
continue;
}
while (!cache.isEmpty()) {
Node node = cache.pop();
int val = node.val, idx = node.idx;
if (val <= temperatures[i]) continue;
res[i] = idx - i;
break;
}
cache.push(new Node(temperatures[i], i));
}
return res;
}
public class Node {
int val;
int idx;
public Node() {
}
public Node(int val, int idx) {
this.val = val;
this.idx = idx;
}
}
}
总结
1)刷题除了训练问题拆解的逻辑连贯性和严谨性,还可以提高积极的动脑习惯。
2)培养好积极思考的能力,一个思考方向不行就另一个思考方向,如从左开始遍历不行,就从右试试。
3)把情况分类整理好,避免多余的重复逻辑即重复代码,提高代码的质量。
参考文献
[1] LeetCode 原题