博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二分法01:查找一个数
阅读量:3951 次
发布时间:2019-05-24

本文共 1210 字,大约阅读时间需要 4 分钟。

查找一个数

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

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在 nums 中并且下标为 4

算法描述:

  • 先从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;
  • 如果目标元素大于中间元素,则在数组大于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
  • 如果目标元素小于中间元素,则在数组小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
  • 如果在某一步骤数组为空,则代表找不到。

复杂度分析

  • 平均时间复杂度: O ( l o g N ) O(logN) O(logN)
  • 最坏时间复杂度: O ( l o g N ) O(logN) O(logN)
  • 最优时间复杂度: O ( 1 ) O(1) O(1)

空间复杂度

  • 迭代: O ( 1 ) O(1) O(1)
  • 递归: O ( l o g N ) O(logN) O(logN)(无尾调用消除)

后面的复杂度也是类似的,不再赘述。

这种搜索算法每一次比较都使搜索范围缩小一半,是典型的二分查找。

这个是二分查找中最简答的一种类型了,我们先来搞定它。 我们来一个具体的例子,假设 nums 为 [-1,0,3,5,9,12], target 为 9。

  • 刚开始数组中间的元素为 3。
  • 9 > 3 ,由于 3 左边的数字都小于 9 ,因此不可能是答案。我们将范围缩写到了 3 的右侧。
  • 此时中间元素为 5。
  • 5 > 3,由于 5 左边的数字都小于 9 ,因此不可能是答案。我们将范围缩写到了 5 的右侧。
  • 此时中间元素为 9,正好是我们要找的target,返回其索引 4 即可。

如何将上面的算法转换为容易理解的可执行代码呢?

def binarySearch(nums, target):    """    :type nums: List[int]    :type target: int    :rtype: int    """    if len(nums) == 0:        return -1    left, right = 0, len(nums) - 1    while left <= right:        mid = (left + right) // 2        if nums[mid] == target:            return mid        elif nums[mid]
right return -1

参考

力扣(LeetCode) (leetcode-cn.com)]

《画解剑指 Offer 》

转载地址:http://idyzi.baihongyu.com/

你可能感兴趣的文章
内核调试案例(oops错误)
查看>>
Linux内核调试 - 一般人儿我都不告诉他(一)
查看>>
Linux内核的Oops
查看>>
基于Linux-2.6.28的 EELiod平台UART驱动分析(一)
查看>>
Linux flash文件系统剖析
查看>>
linux的文件属性和权限学习——分析ls命令结果
查看>>
android 静音与振动
查看>>
android的wake_lock介绍
查看>>
浅析linux设备驱动的clock(时钟)的注册
查看>>
epoll_create epoll_ctl epoll_wait close epoll和select的简单比较
查看>>
学习使用epoll
查看>>
uevent分析
查看>>
OMAP3630 Linux I2C总线驱动分析
查看>>
LDD3 读书笔记之 第 5 章 并发和竞争情况
查看>>
spinlock与linux内核调度的关系
查看>>
Android 显示系统
查看>>
小议C语言中数据的存储类型
查看>>
android双屏显示的一些修改与尝试
查看>>
Android Display System --- Surface Flinger
查看>>
有webservice参与的系统的单元测试, 使用mock object (二)
查看>>