题目:
Given an array arr[], find the maximum j – i such that arr[j] > arr[i]
一个数组,找出最大下标差j-i,且a[i]<a[j]且i<j。
分析:
i必定在以第一个元素开始的降序列中(可以采用反正发证明:假设存在最大下标距离的两个下标i和j,i<j和A[i]<A[j],而且A[i]不在从第一个元素开始的下降序列里。我们一定能找到一个i’,使得i’ < i, 而且A[i’] < A[i],这时候最大下标距离应该是j-i’,而不是j-i。)。首先得倒该序列,然后依次求出该序列每个元素的“最大下标差”。因为序列有大小关系,所以一次遍历即可求出。总共遍历有限次数即可求得,时间复杂度 o(n).
python 代码:
# -*- coding: utf-8 -*-
from random import randint
#generate a unsorted list
origin = []
def randomList():
for i in xrange(0,10,1):
origin.append(randint(-10,10))
print origin
return origin
def maxSpan(data):
lmin = []
rmax = []
temp = data[0]
lmin.append(0)
for i in xrange(1,len(data)):
if data[i] < temp:
lmin.append(i)
temp = data[i]
else:
pass
length = len(data)
temp = data[length-1]
rmax.append(length-1)
for i in xrange(length-2,-1,-1):
if data[i] > temp:
rmax.insert(0,i)
temp = data[i]
else:
pass
i,j = 0,0
result = 0
while i < len(lmin) and j < len(rmax):
if data[lmin[i]] < data[rmax[j]]:
# print data[lmin[i]],data[rmax[j]],lmin[i],rmax[j]
result = result if result > (rmax[j]-lmin[i]) else (rmax[j]-lmin[i])
j += 1
else:
i += 1
print result
if __name__ == "__main__":
maxSpan(randomList())
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。