题目:

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())


jke_zq
50 声望2 粉丝