马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目要求:给一个升序数组,找到target最后一次出现的位置,如果没出现过返回-1;例:给出 [1, 2, 2, 4, 5, 5],target = 2, 返回 2.target = 5, 返回 5.
target = 6, 返回 -1.
先给出正确算法:class Solution:
# @param {int[]} A an integer array sorted in ascending order
# @param {int} target an integer
# @return {int} an integer
def lastPosition(self, A, target):
if not A or target is None:
return -1
start, end = 0, len(A) - 1
while start + 1 < end:
mid = start + (end - start) / 2
if A[mid] < target:
start = mid
elif A[mid] > target:
end = mid
else:
start = mid
if A[end] == target:
return end
elif A[start] == target:
return start
else:
return -1
下面是我写的代码:class Solution:
# @param {int[]} A an integer array sorted in ascending order
# @param {int} target an integer
# @return {int} an integer
def lastPosition(self, A, target):
if not A or target is None:
return -1
start, end = 0, len(A) - 1
while start + 1 < end:
mid = start + (end - start) / 2
if A[mid] > target:
end = mid
else:
start = mid
if A[start] == target:
return start
elif A[end] == target:
return end
return -1
我写的代码错误信息是:输入信息:A为[1,2,2,4,5,5], target为5,应该返回5,但是代码返回4.
我的问题:在我看来和答案代码的区别是在(1)if判断时大于和小于是颠倒的,(2)还有少了一个elif语句。
第(1)个问题想不明白,第(2)个问题,A[mid] > target的其他情况不就是A[mid] < target吗?为什么还要加elif?考虑A[mid] == target?如果考虑的是相等的情况,为什么第一个if里的条件不是>=?
以上,不知道我的问题有没有描述情书,谢谢大家!辛苦了!
本题就是采用折半查找法。先把start和end设为两端,mid为中间,如果A[mid]<target就说明再后一半中,把start改为mid,否则在前一半,把end改为mid,逐渐缩小范围得到答案。这就是前面程序的思路。
我的问题:在我看来和答案代码的区别是在(1)if判断时大于和小于是颠倒的,#这个没关系
(2)还有少了一个elif语句。
第(1)个问题想不明白,第(2)个问题,A[mid] > target的其他情况不就是A[mid] < target吗?为什么还要加elif?考虑A[mid] == target?如果考虑的是相等的情况,为什么第一个if里的条件不是>=?#比如有10个数字5,到A[mid] == target时,按你的>=还会继续折半,就不会得到最后一个5了。
|