https://leetcode-cn.com/problems/daily-temperatures/

单调栈

https://www.yuque.com/docs/share/dcdb944b-0f51-4f7b-a14b-b847ed7bad65?# 《单调栈及其更新结构》

  1. //单调栈解法
  2. public int[] dailyTemperatures(int[] temperatures) {
  3. if (temperatures == null || temperatures.length == 0) {
  4. return new int[0];
  5. }
  6. int N = temperatures.length;
  7. int[] ans = new int[N];
  8. // 求一个数右边最近的比它大的数, 那么栈底到栈顶就从大到小, 栈里放的是下标
  9. Stack<List<Integer>> stack = new Stack<>();
  10. for (int i = 0; i < temperatures.length; i++) {
  11. while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek().get(0)]) {
  12. List<Integer> pop = stack.pop();
  13. for (Integer popi : pop) {
  14. ans[popi] = i - popi;
  15. }
  16. }
  17. if (!stack.isEmpty() && temperatures[stack.peek().get(0)] == temperatures[i]) {
  18. stack.peek().add(i);
  19. } else {
  20. ArrayList<Integer> list = new ArrayList<>();
  21. list.add(i);
  22. stack.push(list);
  23. }
  24. }
  25. return ans;
  26. }