二分查找模板Python实现
Posted 湾区人工智能
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找模板Python实现相关的知识,希望对你有一定的参考价值。
数据结构和算法分析是程序员面试必考内容,接下来打算刷常见面试题,顺便分享给大家。刷,刷,刷,一般中级题目刷300道,刷3遍,国内大部分公司offer随便拿。想进顶级互联网公司,要刷一些高级题目,大概30%难度题目就行,想节省时间,个人推荐报个靠谱培训班。
457. 经典二分查找问题
在一个排序数组中找一个数,返回该数出现的任意位置,如果不存在,返回-1
样例
给出数组 [1, 2, 2, 4, 5, 5].
对于 target = 2, 返回 1 或者 2.
对于 target = 5, 返回 4 或者 5.
对于 target = 6, 返回 -1.
挑战
O(logn) 的时间
class Solution:
"""
@param nums: An integer array sorted in ascending order
@param target: An integer
@return: An integer
"""
def findPosition(self, nums, target):
# write your code here
if not nums or target is None:
return -1
start, end = 0, len(nums) - 1
while start + 1 < end: #注意 1:start + 1避免死循环
mid = (end + start)//2 #注意2: start +(end - start) // 2 可以防止stack overflow
if target < nums[mid]:
end = mid
elif target > nums[mid]:
start = mid #注意3 : = mid可以不用考虑很多细节
else:
return mid
if target == nums[start]: #注意 4: 如果寻找第一个等于目标值的位置,就把return start放在开始,要不然就先return end
return start
if target == nums[end]:
return end
return -1
458. 目标最后位置
给一个升序数组,找到target最后一次出现的位置,如果没出现过返回-1
样例
给出 [1, 2, 2, 4, 5, 5].
target = 2, 返回 2.
target = 5, 返回 5.
target = 6, 返回 -1.
class Solution:
"""
@param nums: An integer array sorted in ascending order
@param target: An integer
@return: An integer
"""
def lastPosition(self, nums, target):
# write your code here
if not nums:
return -1
start, end = 0, len(nums) -1
while start + 1 < end:
mid = (start + end) // 2
if nums[mid] < target:
start = mid
elif nums[mid] > target:
end = mid
else:
start = mid
if nums[end] == target:
return end
if nums[start] == target:
return start
return -1
14. 二分查找
给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。
样例
在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2。
挑战
如果数组中的整数个数超过了2^32,你的算法是否会出错?
class Solution:
"""
@param nums: An integer array sorted in ascending order
@param target: An integer
@return: An integer
"""
def binarySearch(self, nums, target):
# write your code here
if not nums:
return -1
start, end = 0, len(nums) -1
while start + 1 < end:
mid = (start + end) // 2
if nums[mid] < target:
start = mid
elif nums[mid] > target:
end = mid
else:
end = mid
if nums[start] == target:
return start
if nums[end] == target:
return end
return -1
总结:14题和458题分别找第一次和最后一次出现的位置,只需要调整end = mid为start = mid 并且调换位置return start 为先return end
模板就是好用。开始不好理解,多做几遍就好了。
AI预测蛋白质空间结构
决心和意志是学好编程的关键。
生命不息,刷题不止!
程序员之路,别怂,就是干!
扫码关注的工资会翻倍
print_r('关注一下吧');
var_dump('关注一下吧');
NSLog(@"关注一下吧!")
System.out.println("关注一下吧!");
console.log("点个赞吧!");
print("点个赞吧!");
printf("点个赞吧!");
cout << "点个赞吧!" << endl;
Console.WriteLine("转发一下吧!");
fmt.Println("转发一下吧!")
Response.Write("转发一下吧!");
alert(’转发一下吧!’)
以上是关于二分查找模板Python实现的主要内容,如果未能解决你的问题,请参考以下文章