739.每日温度

739.每日温度

题目分析

  1. 相当于寻找右边第一个比它大的位置,维持一个递减栈,存放索引

  2. 输出链表中有几个位置的值已经知道:

    • 最右边第一个一定为0,从这就可以看出类似dp,因为温度不会再变化

    • 所以可以直接从倒数第二个开始,记录当前和它的右边

    • 当前温度<右边温度天数=索引位置的差值
      当前 = 右边 (把当前看成右边位置处理)1)当右边记录天数为0,那么证明不会有升温;2)右边≠0,那么就等于 右边+ 1 即(j - i),其实和下面2)是一样的
      当前>右边1)当右边记录天数为0,那么证明一定不可能再超过当前;2)右边≠0,转到 j 记录的位置,再继续判断

Solution

递减栈

    public int[] dailyTemperatures2(int[] T) {
    	if (T == null || T.length == 0) return null;
    	int[] result = new int[T.length];
    	Stack<Integer> stack = new Stack<>();
    	for (int i = 0; i < T.length; i++) {
    		// 这里应该要写大于,不要写大于等于
			while (!stack.isEmpty() && T[i] > T[stack.peek()]) {
				result[stack.peek()] = i - stack.peek();
				stack.pop();
			}
			stack.push(i);
		}
    	return result;
    }

dp

    public int[] dailyTemperatures(int[] T) {
    	if (T == null || T.length == 0) return null;
    	int[] values = new int[T.length];
    	for (int i = T.length - 2; i >= 0; i--) {
			int j = i + 1;
			while (true) {
				if (T[i] < T[j]) {
					values[i] = j - i;
					break;
				} else if (values[j] == 0) {
					values[i] = 0;
					break;
				}
				// 当T[i] == T[j]的时候,转到j记录的位置继续判断
				j = j + values[j];
			}
		}
    	return values;
    }

Reference:小码哥MJ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值