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