|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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了。
|
|