图片说明

  • 解法一利用双栈来求解 一个栈记录的是坐标 一个栈记录的是数据
    因为留栈里都是暂时没人比他大的数,所以也就是最外层
    class Solution {
        public static int[] dailyTemperatures(int[] T) {
          //记录value
          Stack<Integer> stack = new Stack<Integer>();
          //记录index
          Stack<Integer> pro = new Stack<Integer>();
          int [] arr = new int [T.length];
          if(T.length<=1){
              return arr;
          }
          pro.add(0);
          stack.add(T[0]);
          int i = 1;
          while(i<T.length&&!stack.empty()) {
              while (!stack.empty()&&stack.peek() < T[i]) {
                  stack.pop();
                  int j = pro.pop();
                  arr[j] = i-j;
              }
              stack.push(T[i]);
              pro.push(i);
              i++;
          }
          return arr;
      }
    }
  • 区域性记录最大
    • 逆序遍历 每个位记录离自己最近且最大的一个数 如果下一次循环(也就是跟下一个位比较时),发现下一个位比自己还要小,则比较它的最近最大的一个数。也就是跳越式查找。
 class Solution {
  public int[] dailyTemperatures(int[] tArr) {
        int len = tArr.length;
        int[] ansArr = new int[len];
        ansArr[len - 1] = 0;

        for (int i = len - 2; i >= 0; i--) {
            if (tArr[i] < tArr[i+1]) {
                ansArr[i] = 1;
                continue;
            }

            int rightIndex = i + 1 + ansArr[i+1];
            while (ansArr[rightIndex] != 0 && tArr[rightIndex] <= tArr[i]) {
                rightIndex += ansArr[rightIndex];
            }

            ansArr[i] = tArr[rightIndex] > tArr[i] ? rightIndex - i : 0;
        }

        return ansArr;
    }
    }