如何找出数据中最小的k个数
方法一:将数据排序,然后从排好序的数组中找到第k小的数
方法二:使用选择排序的方式,排序k次,找到第k小的数
方法三:使用快速排序的思想,从中随机选择一个数mid,然后将其划分为三部分
array[low.mid-1]、array[mid]、array[mid+1,high],也就是这三个部分,如果mid-low=k-1那么我们认为array[mid]就是我们所需要找到的,如果mid-low>k-1,那么我们需要从[low,mid-1]中找到第k小的数。如果mid-low<k-1那么我们需要从array[mid+1,high]中找到最小的第k-(mid-low)-1小的值就可以了。
def findsmallK(array,low,high,k):
i=low
j=high
middata=array[i]
while i<j:
while i=middata:
j-=1
if i<j:
array[i]=array[j]
i+=1
while i
i+=1
if i<j:
array[j]=array[i]
j-=1
array[i]=middata#i就是中间值
subArrayIndex=i-low#中间处的坐标
if subArrayIndex==k-1:
return array[i]
elif subArrayIndex>k-1:
return findsmallK(array,low,i-1,k)
else :
return findsmallK(array,i+1,high,k-(i-low)-1)
if __name__=="__main__":
array=[4,0,1,0,2,3]
k=6
data=findsmallK(array,0,len(array)-1,k)
print(data)如何求数组连续最大和
我们可以维护两个空间,一个空间用于计算每个能够连续的最大和,而另外一个用于存储最大的和
def arrsum(arr):
arrlength=len(arr)
S=[None]*arrlength#记录连续的计算和
MS=[None]*arrlength#记录最大的和
S[0]=arr[0]
MS[0]=arr[0]
i=1
while i<arrlength:
S[i]=max(S[i-1]+arr[i],arr[i])
MS[i]=max(MS[i-1],S[i])
i+=1
return MS[arrlength-1]
if __name__=="__main__":
arr=[1,-2,4,8,-4,7,-1,-5]
data=sum=arrsum(arr)
print(data)
还可以不维护空间,而是直接计算最大值:
def arrsum(arr):
arrlength=len(arr)
#S=[None]*arrlength#记录连续的计算和
#MS=[None]*arrlength#记录最大的和
#S[0]=arr[0]
#MS[0]=arr[0]
S=arr[0]
MS=arr[0]
i=1
while i<arrlength:
S=max(S+arr[i],arr[i])
MS=max(MS,S)
i+=1
return MS
if __name__=="__main__":
arr=[1,2,3,-4]
data=sum=arrsum(arr)
print(data)计算最大子组的位置
计算最大子组和最大子组的位置,关键在于只要目前nMax相加的是负数,那么说明前面的已经没有意义了,那么就需要重新统计,如果要是为正,那么加上一切可以加上的,如果加上的比Smax要大,那么说明这个有意义,我们需要更改一些信息(这里永远记录最有用的信息),但是如果加上还没有那个大,那说明加上的没有意义。
class Demo:
def __init__(self):
self.begin=0
self.end=0
def maxArrayValue(self,arr):
nMax=-2**31
SMax=0
st=0
i=0
lengths=len(arr)
while i<lengths:
if nMax<0:#只要小于0,那么就永远接收最新的
nMax=arr[i]
st=i
else:
nMax=nMax+arr[i]
if nMax>SMax:
self.begin=st
self.end=i
SMax=nMax
i+=1
return SMax
def getBegin(self):
return self.begin
def getEnd(self):
return self.end
if __name__=="__main__":
arr=[1,-2,4,8,-4,7,-1,-5]
d=Demo()
data=d.maxArrayValue(arr)
print(data)
print(d.begin,d.end)
如何求数组中两个元素的最小距离
def minDistance(array,num1,num2):
if array==None or len(array)<1:
return None
lastnumindex1=-1
lastnumindex2=-1
i=0
mindis=2**30
while i<len(array):
if array[i]==num1:
lastnumindex1=i
if lastnumindex2>0:
mindis=min(mindis,abs(lastnumindex2-lastnumindex1))
if array[i]==num2:
lastnumindex2=i
if lastnumindex1>0:
mindis=min(mindis,abs(lastnumindex2-lastnumindex1))
i+=1
return mindis
if __name__=="__main__":
arr=[4, 6, 7, 4, 7, 4, 6, 4, 7, 8, 5, 6, 4, 3, 10, 8]
num1=4
num2=8
print(minDistance(arr,num1,num2))求三元组的距离
def MinDistance(a,b,c):
minDist=2**23
i=0
j=0
k=0
d=0
while True:
d=max(abs(a[i]-b[j]),abs(a[i]-c[k]))
d=max(d,abs(c[k]-b[j]))
if d<minDist:
minDist=d
m1=min(a[i],b[j])
m2=min(m1,c[k])
if m2==a[i]:
#print(a[i])
i+=1
if i>len(a)-1:
print(a[i-1],b[j],c[k])
break
elif m2==b[j]:
j+=1
if j>len(b)-1:
break
else:
k +=1
if k > len(c) - 1:
break
return minDist
if __name__=="__main__":
a=[3, 4, 5, 7, 15]
b=[10, 12, 14, 16, 17]
c=[20, 21, 23, 24, 30, 37]
dis=MinDistance(a,b,c)
print(dis)
如何在不排序的情况下求中位数
def findMid(array,low,high,k):
i=low#获取起始的坐标
j=high#获取终止的坐标
firstdata=array[i] # 获取中间元素
while i<j:
while i=firstdata:
j-=1
if i<j:
array[i]=array[j]
i+=1
while i
i+=1
if i<j:
array[j]=array[i]
j-=1
array[i]=firstdata
if i-low==k-1:
if len(array)%2==0:#偶数
return (array[i]+array[i+1])/2
else:
return array[i]
elif i-low>k-1:
return findMid(array,low,i-1,k)
else:
return findMid(array,i+1,high,k-(i-low)-1)
if __name__=="__main__":
array=[1,2,3,4,5]
low=0
high=len(array)-1
if len(array)%2==0:
k=(len(array))//2
else:
k=(len(array))//2+1
#k表示第几小
data=findMid(array,low,high,k)
print(data)如何获取最好的矩阵链相乘方法
def MatrixChainOrder(array,i,j):
if i==j:
return 0
mins=2**32
k=i
while k<j:
min=MatrixChainOrder(array,i,k)+MatrixChainOrder(array,k+1,j)+array[i-1]*array[k]*array[j]
if min<mins:
mins=min
k+=1
return mins
if __name__=="__main__":
array=[1,5,2,4,6]
print(MatrixChainOrder(array,1,len(array)-1))#将除了第一个和最后一个的包裹起来如何对大量重复的数字进行排序
def sort(array):
data_count=dict()
i=0
while i<len(array):
if str(array[i]) in data_count:
data_count[str(array[i])]=data_count.get(str(array[i]))+1
else:
data_count[str(array[i])]=1
i+=1
index=0
#print(data_count)
for key in sorted(data_count.keys(),key=lambda d:int(d)):
i=data_count[key]
while i>0:
array[index]=key
index+=1
i-=1
if __name__=="__main__":
array=[15,12,15,2,2,12,2,3,12,100,3,3]
sort(array)
i=0
while i<len(array):
print(array[i])
i+=1如何在有规律的二维数组中进行高效的数据查找
def findWithBinary(array,data):
if array==None or len(array)<1:
print("参数不合理")
return False
i=0
rows=len(array)
columns=len(array[0])
j=columns-1
while i=0:
if array[i][j]==data:
return True
elif array[i][j]>data:
j-=1
else:
i+=1
return False
if __name__=="__main__":
array=[[1,2,3,4],[11,12,13,14],[21,22,23,24],[31,32,33,34],[41,42,43,44]]
print(findWithBinary(array,17))
print(findWithBinary(array,24))从三个有序的数组中找出他们的公共元素
def findCommon(array1,array2,array3):
i=0
j=0
k=0
while i<len(array1) and j<len(array2)and k<len(array3):
if array1[i]==array2[j]==array3[k]:
i+=1
j+=1
k+=1
print(array1[i-1])
elif array1[i]<array2[j]:
i+=1
elif array2[j]<array3[k]:
j+=1
else:
k+=1
if __name__=="__main__":
array1=[2,5,12,20,45,85]
array2=[16,19,20,85,200]
array3=[3,4,15,20,39,72,85,190]
findCommon(array1,array2,array3)如何求一个字符串所有的排列
def swap(str,index1,index2):
tmp=str[index1]
str[index1]=str[index2]
str[index2]=tmp
#看成是两个子问题,一个子问题的从一个字符缩减角度,另外一个是从替换的角度
def Permutation(str,start):
if str is None and start <0:
return
if start==len(str)-1:
print("".join(str))
else:
i=start
while i<len(str):
swap(str,start,i)
Permutation(str,start+1)
swap(str,start,i)
i+=1
def Permutation_transe(s):
str=list(s)
Permutation(str,0)
if __name__=="__main__":
a="abc"
Permutation_transe(a)
print()
递归问题的核心是将问题转变为子问题,然后还要设置好结束条件