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

  • 相关阅读:
    [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程
    [笔记] Ubuntu 18.04源码编译安装OpenCV 4.0流程
    [笔记] Ubuntu 18.04安装Docker CE及nvidia-docker2流程
    [笔记] Ubuntu 18.04安装cuda 10及cudnn 7流程
    [笔记]Win10下编译Tesseract-OCR 4.0
    [笔记]Python中模块互相调用的例子
    [笔记]mosh使用笔记
    [笔记]Delphi 2007写DLL供VC调用实例
    [笔记]Python的调试器pudb简易教程
    [笔记] Ubuntu下编译ffmpeg+openh264+x264
  • 原文地址:https://www.cnblogs.com/asenyang/p/10748334.html
Copyright © 2011-2022 走看看