# -*- coding: cp936 -*-
'''
支配值数目
已知f[]与g[]两个整数数组,元素已经从小到大排列,请写一个程序,
算出f[]中比g[]元素大的对数。换句话说,f[0]比g[]中多少个元素大,
f[1]比g[]中多少元素大等,这些值的总和就是要求的答案。
'''
def ComputSumOfBigger(fList , gList):
if (len(gList) == 0) or (len(fList) == 0):
return -1
sumOfBigger=0
indexg=0
tempLen=0
for item in fList:
while(indexg < len(gList) and item > gList[indexg]):
indexg+=1
tempLen+=1
sumOfBigger+=tempLen
print "f[]中比g[]元素大的个数%d" %(sumOfBigger)
ComputSumOfBigger([1,3,5,7,9], [2,3,4,7,8])
另外附上M.Rem的c++代码,思路相似,我是以gList为着力点算长度,M.Rem先生以fList为着力点算长度,
我的算法维护tempLen多了点时间复杂度,不管一个数组是否结束,总要判断indexg < len(gList),有少许性能损失
int dominance_count(int f[], int g[], int m, int n)
{
int index_f, index_g;
int count;
count=index_f=index_g=0;
while(index_f<m && index_g <n)
{
if(f[index_f <= g[index_g]])
{
index_f++;
}
else
{
index_g++, count+=m-index_f;
}
}
return count;
}