鱼C论坛

 找回密码
 立即注册
查看: 1647|回复: 6

[已解决]算法题-目标最后位置-last Position

[复制链接]
发表于 2017-8-16 21:58:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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里的条件不是>=?
以上,不知道我的问题有没有描述情书,谢谢大家!辛苦了!
最佳答案
2017-8-16 22:47:39
本题就是采用折半查找法。先把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了。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-16 22:47:39 | 显示全部楼层    本楼为最佳答案   
本题就是采用折半查找法。先把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了。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-8-16 22:56:53 | 显示全部楼层
if A[mid] > target:  
                end = mid   #因为这里先满足的是end 所以,后面要先返回end(因为你start也有值,end也有值,顺序不对的话,返回的数据就不对了。)
            else:
                start = mid  
  if A[end] == target:
            return end
        elif A[start] == target:
            return start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-16 23:16:26 | 显示全部楼层
这题倒序查找不是更好吗?倒序查找到的第一个就是答案,不然就返回-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-16 23:18:28 | 显示全部楼层
jerryxjr1220 发表于 2017-8-16 23:16
这题倒序查找不是更好吗?倒序查找到的第一个就是答案,不然就返回-1

数据量大时,折半查找效率会高些。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-17 20:50:33 | 显示全部楼层
本帖最后由 哲子DZ 于 2017-8-17 20:53 编辑

==问题清楚了,自己加了代码还是有问题,我自己再想一下,要是不能解决再向您请教,谢谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-17 20:53:59 | 显示全部楼层
ba21 发表于 2017-8-16 22:56
if A[mid] > target:  
                end = mid   #因为这里先满足的是end 所以,后面要先返回end(因 ...

好的,明白了,谢谢您!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-14 20:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表