zoukankan      html  css  js  c++  java
  • leetcode739

     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大的元素就可以了。中间可以跳过很多循环,从而提高了算法的效率。

  • 相关阅读:
    搭建自己的SIPserver:开源sipserveropensips的搭建及终端TwInkle的使用
    字符串类习题、面试题具体解释(第二篇)
    【Android笔记】MediaPlayer基本使用方式
    poj 1258 Agri-Net
    ActionScript3游戏中的图像编程(连载二十四)
    SQL中declare申明变量
    CreateFileMapping使用方法
    【剑指offer】调整数组顺序
    2015美团网笔试面试总结(嵌入式/硬件类)(美团网校园招聘)
    linux串口驱动分析
  • 原文地址:https://www.cnblogs.com/asenyang/p/10748334.html
Copyright © 2011-2022 走看看