前言
很简单的一道题,但是我却好像发现了一个BUG,后面会有讲到。。。
问题描述
解法
这个题基本上没有别的方法了吧,二分法。连着好几道都是二分法了,当然也可以采用O(n)的方法,但这也是最大的疑惑呀。。。
直接给我的代码吧
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
begin = 0
end = len(nums)
while end>begin:
current = (begin+end)//2
if target>nums[current]:
begin = current+1
elif target<nums[current]:
end = current
else:
return current
return end
这个是我提交的最好的一份代码,按理说是最好的,我一共提交了好几版,下面是运行速度。
第一次提交的代码时实验用的最慢,第二次提交的代码如下:
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
begin = 0
end = len(nums)
while end>begin:
current = (begin+end)//2
if target==nums[current]:
return current
elif target>nums[current]:
begin = current+1
else:
end = current
return end
不知道大家有没有发现不同之处?不同之处就是循环里面的判断条件的先后顺序,第三次提交是把等于判断放在了中间,第四次也就是最快的一次,放在了最后。为啥会有区别的?这应该主要牵涉到if语句的优先级有关。由题中可以看出,列表中最多会有一个值和目标值相等,所以如果把等于放在最前面的话,每次进入循环都要先判断是否相等,如果不等再判断是否大于小于,然而不幸的是在绝大多数情况下都是不等的,所以这次操作是无用的,耗费了时间。如果先判断大于小于的话,最多会执行两次比较操作,一旦条件成立则不会执行后的操作。这应该就是原因了吧。
BUG
我觉得这应该是最快的了吧,但其实还有好几个比这个还要好的,点开第一名的看一看,竟然惊奇地发现他竟然采用的是遍历。。。。。而且最坏的情况还要排序后再遍历。。。。。但是却是最快的。。。。。。无语了。。。。很可能是测试样例的原因,需要找的目标在靠前的位置,导致每次都能很快地找到。具体原因我也不太清楚了,大家如果有想法,可以给指明一下原因,不胜感激!
给出第一名的代码:
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
for i in range(0,len(nums)):
if nums[i]==target:
return i
else:
nums.append(target)
nums.sort()
for x in range(0,len(nums)):
if nums[x]==target:
return x
else:
pass
总结
虽说是一个简单的题,但是还确实是学到了一点东西哈。好了,今天就到这了。