# encoding: utf-8
def FindClosetLagerAndLower(Array):
L = list()
R = list()
LH = list()
RH = list()
if len(Array)%2==0:
half = len(Array)/2
firstHalf = Array[0:half]
secondHalf = Array[half:len(Array)]
else:
half = len(Array)/2
firstHalf = Array[0:half+1]
secondHalf =Array[half+1:len(Array)]
for i in range(len(firstHalf)):
count = 0
if i == 0:
L.append(-1)
for j in range(i-1,-1,-1):
if(firstHalf[i]<firstHalf[j]):
L.append(j)
break
elif(firstHalf[i]>=firstHalf[j]):
count = count + 1
if(count== i):
L.append(-1)
R = [-1]*len(firstHalf)
for i in range(len(firstHalf)):
count = 0
for j in range(i+1,len(firstHalf)):
if(firstHalf[i]<firstHalf[j]):
R[i] = j
break
elif(firstHalf[i]>firstHalf[j]):
count = count+1
if(count == len(firstHalf)-i+1):
R[i]==[-1]
for i in range(len(secondHalf)):
count = 0
if i == 0:
LH.append(-1)
for j in range(i-1,-1,-1):
if(secondHalf[i]<secondHalf[j]):
LH.append(j+len(firstHalf))
break
elif(secondHalf[i]>=secondHalf[j]):
count = count + 1
if(count== i):
LH.append(-1)
RH = [-1]*len(secondHalf)
for i in range(len(secondHalf)):
for j in range(i+1,len(secondHalf)):
if(secondHalf[i]<secondHalf[j]):
RH[i] = j+len(firstHalf)
break
elif(secondHalf[i]>secondHalf[j]):
count = count + 1
if(count == len(secondHalf)-i+1 ):
RH[i] = -1
for i in range (len(firstHalf)):
for j in range(len(secondHalf)):
if(R[i]==-1 and firstHalf[i]<secondHalf[j]):
R[i] = j+len(firstHalf)
break
for i in range(len(secondHalf)):
for j in(range(len(firstHalf)-1,-1,-1)):
if(LH[i]==-1 and firstHalf[j]>secondHalf[i]):
LH[i] = j
break
R = R + RH
L = L + LH
return L,R
A= [4,2,3,1,8,5,6,9]
L,R = FindClosetLagerAndLower(A)
print(L)
print(R)
normal-O(n ^ 2)最佳情况-O(n ^ 2)