import time
class Solution(object):
def maxDiff(self, arr):
listlen = len(arr)
if listlen <= 1:
print("NaN")
return None
minnum = min(arr[0], arr[1])
maxdiff = arr[1] - arr[0]
for i in range(2, listlen):
if arr[i] > minnum:
maxdiff = max(maxdiff, arr[i]-minnum)
else:
minnum = arr[i]
# print('minnum:',minnum)
# print('maxdiff:',maxdiff)
return maxdiff
if __name__ == '__main__':
solution = Solution()
arr1 = [1]
arr2 = [4, 40, -7, 5, 11, -60, 9, 0, 12]
solution.maxDiff(arr1)
start = time.time()
for i in range(10000):
solution.maxDiff(arr2)
elapsed = (time.time() - start)/10000
print("elapsed:", elapsed)
我参考的CRIM写的Python版。我觉得他是思路清晰好懂。
首先排除异常情况,如列表只有1个值的时候。像其他大佬就没考虑这个情况。
然后就是不断更新列表里的最小值和最大差值。
进一步还可以建一个空列表用来记录最终用来计算最大差值的数字在原列表里的位置。
当然,算法还有优化的地方,比如
if arr[i] > minnum:
maxdiff = max(maxdiff, arr[i]-minnum)
这部分还可以对arr[i]和之前的值比较,除非比之前的大值还大,否则就不用再相差之后再取max。
现在附上优化算法,增加了maxnum用来记录目前的最大值:
import time
class Solution(object):
def maxDiff(self, arr):
listlen = len(arr)
if listlen <= 1:
print("NaN")
return None
minnum = min(arr[0], arr[1])
maxnum = max(arr[0], arr[1])
maxdiff = arr[1] - arr[0]
for i in range(2, listlen):
if arr[i] > minnum:
if arr[i] > maxnum:
maxnum = arr[i]
maxdiff = max((maxnum - minnum), maxdiff)
else:
minnum = arr[i]
maxnum = arr[i]
# print('minnum:',minnum)
# print('maxnum:',maxnum)
# print('maxdiff:',maxdiff)
return maxdiff
if __name__ == '__main__':
solution = Solution()
arr1 = [1]
arr2 = [4, 40, -7, 5, 11, -60, 9, 0, 12]
solution.maxDiff(arr1)
start = time.time()
for i in range(10000):
solution.maxDiff(arr2)
elapsed = (time.time() - start)/10000
print("elapsed:", elapsed)
注释掉print是因为这个输出也会占用系统测试时间。
用time测试了一万次,第二种优化后的方法是比第一种高的。
紧接着我有想到,既然都这样了,那都也不用先判断是否比minnum大了,直接和maxnum比就好了。于是代码改成:
import time
class Solution(object):
def maxDiff(self, arr):
listlen = len(arr)
if listlen <= 1:
print("NaN")
return None
minnum = min(arr[0], arr[1])
maxnum = max(arr[0], arr[1])
maxdiff = arr[1] - arr[0]
for i in range(2, listlen):
if arr[i] > maxnum:
maxnum = arr[i]
maxdiff = max((maxnum - minnum), maxdiff)
else:
minnum = arr[i]
maxnum = arr[i]
# print('minnum:',minnum)
# print('maxnum:',maxnum)
# print('maxdiff:',maxdiff)
return maxdiff
if __name__ == '__main__':
solution = Solution()
arr1 = [1]
arr2 = [4, 40, -7, 5, 11, -60, 9, 0, 12]
solution.maxDiff(arr1)
start = time.time()
for i in range(10000):
solution.maxDiff(arr2)
elapsed = (time.time() - start)/10000
print("elapsed:", elapsed)
这层优化效果不明显,不过思路就是这样,
目前把这道题我能回答的都回答了。欢迎大家交流。