力扣-二分法的算法与逻辑

数学逻辑上,二分法可以描述为以下步骤:

1. 确定初始搜索区间:假设有一个有序数组arr,需要在其中找到一个特定的元素target。初始时,搜索区间为整个数组,即[low, high](索引),其中low是数组的第一个元素,high是数组的最后一个元素。

2. 计算中点:在搜索区间[low, high]内,找到中间的元素mid,可以通过以下公式计算:

如果low和high的值都是整数,则mid是它们平均值的下取整。

3. 比较中点和目标值:将中点mid的值与目标值target进行比较:

如果mid的值等于target,则搜索成功,返回mid的索引。

如果mid的值大于target,则目标值在搜索区间的左半部分,即[low, mid - 1]。

如果mid的值小于target,则目标值在搜索区间的右半部分,即[mid + 1, high]。

4. 更新搜索区间:根据比较结果,将搜索区间更新为新的[low, high],并重复步骤2和3,直到找到目标值或者搜索区间为空。

5. 结束搜索:如果在搜索过程中找到了目标值,则搜索结束,返回目标值的索引。如果搜索区间为空,则表示目标值不在数组中,搜索失败。

        二分法之所以高效,是因为它每次迭代都将搜索区间缩小一半,因此搜索过程会很快收敛。此外,由于数组是有序的,二分法可以确保在找到目标值之前不会检查数组中的每个元素,这使得它在处理大量数据时非常有效。

在算法中,进行二分法之前,可以建立指针(也就是一个初始角标):

题目:

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

  1. class Solution:
  2.     def search(self, nums: List[int], target: int) -> int:
  3.         left,right = 0, len(nums)-1
  4.         当左指针小于右指针,继续
  5.         while(left <= right):
  6.             中间索引
  7.             mid = (right - left)//2 + left
  8.             获取中间位置
  9.             num  = nums[mid]
  10.             if target==num:
  11.                 return mid
  12.             elif num> target:
  13.                 right  = mid-1
  14.             else:
  15.                 left = mid +1
  16.         return -1
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值