如何解决返回排序数组中每个数字的最后一个满足的函数
我编写了一个函数,该函数返回从0到9的每个数字的第一个满足条件
array = [0,1,2,3,4,5,6,7,8,9,9]
def lower(a,val,left,right):
if left == right:
return left
mid = (left + right) // 2
if a[mid] < val:
return lower(a,mid+1,right)
else:
return lower(a,mid)
for i in range(10):
print(lower_bound(array,i,len(array)-1),end =' ')
结果:0 2 4 6 8 10 12 14 16 18。
我试图编写一个函数,该函数返回从0到9的每个数字的最后一个满足条件。 1 3 5 7 9 11 13 15 17 19
但是它不能正常工作( 你能帮我吗? 这是我的功能。
def upper(a,right):
if left == right:
return left
mid = (left + right) // 2
if a[mid] <= val:
return upper(a,right)
else:
return upper(a,mid)
解决方法
原因是,在每种情况下,您都位于最后一次出现,并且right
是后一个索引,您找到了合适的索引,但又向前移动了一步。该算法似乎不错,但是只需消除这种情况,一切都可以正常进行:
array = [0,1,2,3,4,5,6,7,8,9,9]
def upper(a,val,left,right):
if left == right:
if a[left] == val:
return left
else:
return left-1
mid = (left + right) // 2
if a[mid] <= val:
return upper(a,mid+1,right)
else:
return upper(a,mid)
for i in range(10):
a = upper(array,i,19)
print(a)
输出:
1
3
5
7
9
11
13
15
17
19
检查了其他几个项目,我认为效果很好
,您需要返回left-1
而不是left
。这是因为,当您到达val mid
的最后一个索引时,第一个if将从mid+1
(upper(a,right)
)中查找
def upper(a,right):
if left == right:
return left-1
mid = (left + right) // 2
if a[mid] <= val:
return upper(a,mid)
,
在计算mid
时使用下限函数表示该函数不对称。您不能只镜像其中一部分而不考虑另一部分。
def upper(a,right):
if left == right:
return left
mid = (left + right + 1) // 2
if a[mid] > val:
return upper(a,mid-1)
else:
return upper(a,mid,right)
,
要找到初次见面的人:
for i in range(10):
print(array.index(i))
要找到上次见面的人:
inverted_array = array[::-1]
for i in range(10):
print(len(array) - 1 - inverted_array.index(i))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。