LeetCode:704_二分查找(Binary Search)
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
方法:二分查找
二分查找是一种基于比较目标值和数组中间元素的教科书式算法。
如果目标值等于中间元素,则找到目标值。
如果目标值较小,继续在左侧搜索。
如果目标值较大,则继续在右侧搜索。
算法:
初始化指针 left = 0, right = n - 1。
当 left <= right:
比较中间元素 nums[pivot] 和目标值 target 。
如果 target = nums[pivot],返回 pivot。
如果 target < nums[pivot],则在左侧继续搜索 right = pivot - 1。
如果 target > nums[pivot],则在右侧继续搜索 left = pivot + 1。
class Solution: def search(self, nums: List[int], target: int) -> int:
#函数标注通常用于 类型提示:例如以下函数预期接受两个 int 参数并预期返回一个 int 值: left, right = 0, len(nums) - 1 #初始化左右指针 while left <= right: #指针的判断准则 pivot = left + (right - left) // 2 #选择数组中间中间元素,取整 if nums[pivot] == target: #如果刚好符合条件,结束 return pivot if target < nums[pivot]: #如果目标小于中间元素,右边的指针取中间左侧 right = pivot - 1 else: left = pivot + 1 #如果目标大于中间元素,左边的指针取中间右侧
return -1 #函数只会返回一个值,且是第一个
快速复些:
1 class Solution(object): 2 def search(self, nums, target): 3 """ 4 :type nums: List[int] 5 :type target: int 6 :rtype: int 7 """ 8 n=len(nums) 9 left,right=0,n-1 10 11 while left<= right: 12 mid=left + ( right - left ) //2 13 if target==nums[mid]: 14 return mid 15 # break 16 if target>nums[mid]: 17 left=mid+1 18 else: 19 right=mid-1 20 return -1
说明:函数只能返回一个值,返回第一个值
复杂度分析
时间复杂度:O(logN)。
空间复杂度:O(1)。
作者:LeetCode
链接:https://leetcode-cn.com/problems/binary-search/solution/er-fen-cha-zhao-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。