1 class Solution(object): 2 def dailyTemperatures(self, T: 'List[int]') -> 'List[int]': 3 S = list() 4 n = len(T) 5 SR = [0] * n 6 nexD = 0 7 for i in range(n): 8 t = T[i] 9 if len(S)==0: 10 S.append(t) 11 else: 12 n2 = len(S) 13 for j in range(n2-1,-1,-1): 14 preT = S[j] 15 nexD += 1 16 if preT < t: 17 if SR[j] == 0: 18 SR[j] = nexD 19 else: 20 break 21 22 nexD = 0 23 S.append(t) 24 return SR
补充另一种写法,效率更高:
1 class Solution: 2 def dailyTemperatures(self, T: 'List[int]') -> 'List[int]': 3 res = [0] * len(T) 4 for i in range(len(T)-2, -1, -1): 5 n = i + 1 6 while T[i] >= T[n]: 7 if res[n] == 0: 8 break 9 n += res[n] 10 else: 11 res[i] = n - i 12 return res
自己重新写了一个:
1 class Solution(object): 2 def dailyTemperatures(self, T: 'List[int]') -> 'List[int]': 3 n = len(T) 4 R = [0] * n 5 for i in range(n-2,-1,-1): 6 #print(i) 7 j = i + 1 8 while j < n: 9 if T[i] < T[j]: 10 R[i] = j - i 11 break 12 else: 13 if R[j] == 0: 14 break 15 else: 16 j += R[j] 17 return R
两层循环处理,下面给出解释:
第一层循环,从后向前,最后一个元素肯定标记为0,因为它是最后一个元素(废话)。
第二层循环,从倒数第二个元素开始判断,记录当前位置为i,其后面的元素为j,
如果j元素比i元素大,那么就对i进行标记,
如果j元素不比i元素大,那么就继续向后找。但是为了提高效率,这里不是将j++,因为已经可以“确定”比j元素大的下一个元素的位置了。
如果j已经被标记为0,那么说明后面没有比j更大的元素了。j++也就没有意义了,因为不可能找到比i更大的元素,此时直接标记i为0。
如果j不为0,那么直接比较i和下一个比j大的元素就可以了。中间可以跳过很多循环,从而提高了算法的效率。