在极客网上看到了这个算法题感觉很有意思,这里我们主要是实现该问题的解答,具体题目中的算法复杂度要求我没有做太多考虑,一开始我设计了一个很简单的程序去实现这个题目。具体题目内容如下图。
1:首先看到这个算法题,我的思路是先将两个列表合并成一个列表(Python中是列表和C语言中的数组组很相似),然后我们将合并后的列表进行排序,这样我们只用根据下标来得到我们最终想要的结果。
def middle(list1,list2):
list3 = [] #定义一个空列表
for i in list1: #遍历列表1
list3.append(i)
for j in list2: #遍历列表2
list3.append(j)
list3.sort() #通过内置函数将列表3内函数排序
length = len(list1)+len(lsit2)
if length%2 == 1:
return float(list3[length//2])
elif length%2 == 0:
return (list3[length//2]+list3[(length//2)-1])/2
这个程序中,我们利用了Python中很多优秀的内置函数,在程序的最后部分,我们为了得到想要的结果,我们利用了下标来寻找我们的中位数,当排序后的列表(list3)长度是一个奇数的时候,我们的中位数就是列表(list3)中的一个确定的数,我们只要取得中间那一个下标所对应的值就OK;当我们的排序后的列表(list3)的长度是偶数的时候,我们需要计算出列表(list3)中间两位数的平均值,这样就行了。
这个程序可以实现我们想要的效果,但是程序中需要遍历两次列表,这样程序的算法复杂度就比较高了,所以我们需要改进我们的程序。
- 我们先假设两个列表中,列表(list1)比列表(list2)长,那么我们可以知道中位数的下标值(length//2,其中length表示列表1和列表2的长度之和)肯定比列表(list1)的长度小。
- 这样我们就可以利用列表(list1)的下标来获取中位数的值,但是在这之前还有一步操作
- 我们需要将列表(list2)中所有小于列表(list1)中最后一个元素的所有项添加到列表(list1)中去,这样我们就不要管列表(list2)中那些比列表(list1)所有项都大的元素了。
#判断两个列表关系以及后续操作的函数
def middle(l1, l2):
length = len(l1) + len(l2)
if len(l1) > len(l2):
result = appendpart(l1, l2, length)
return result
elif len(l1) < len(l2):
result = appendpart(l2, l1, length)
return result
elif len(l1) == len(l2):
if l1[len(l1) - 1] <= l2[len(l2)-1]:
result = appendpart(l2, l1, length)
return result
elif l2[len(l2) - 1] < l1[len(l1)-1]:
result = appendpart(l1, l2, length)
return result
#列表添加以及求中位数的函数
def appendpart(list1, list2, length):
for i in list2:
if i <= list1[len(list1) - 1]: #将list2中所有小于list1中最后一项的元素添加到lsit1中
list1.insert(0,i)
list1.sort()
if length % 2 == 1: #通过判断列表长度的奇偶来确定中位数的下标
return float(list1[length // 2])
else:
return (list1[length // 2] + list1[(length // 2) - 1]) / 2
这是完整的代码,但是这里有一个情况还需要考虑一下,那就是当两个列表的长度的相等的时候,我们需要判断哪一个列表中的元素更大一些,这样我们才可以确定将哪个列表添加到另一个列表中。