14. 二分查找

描述

给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1

您在真实的面试中是否遇到过这个题?  是

题目纠错

样例

在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2

挑战

如果数组中的整数个数超过了2^32,你的算法是否会出错?

14. First Position of Target

Description

For a given sorted array (ascending order) and a target number, find the first index of this number in O(log n)time complexity.

If the target number does not exist in the array, return -1.

Have you met this question in a real interview?  Yes

Problem Correction

Example

If the array is [1, 2, 3, 3, 4, 5, 10], for given target 3, return 2.

Challenge

If the count of numbers is bigger than 2^32, can your code work properly?

二分查找使用迭代永远不会发生栈溢出

看代码吧,记得看最后的备注

#用迭代实现二分法
#写个类吧
class Solution:def binarySearch(self, nums, target):return self.search(nums, 0, len(nums) - 1, target)def search(self, nums, start, end, target):if start > end:return -1#start, end = 0, len(nums) -1mid = (start + end)//2if nums[mid] > target:return self.search(nums, start, mid, target)if nums[mid] == target:return midif nums[mid] < target:return self.search(nums, mid, end, target)my_solution = Solution()
nums = [1,2,3,4,5,6]
target = 2
#start, end = 0, len(nums) -1
targetIndex = my_solution.binarySearch(nums, target)
print(targetIndex)
'''
#用迭代实现二分法
#写个函数吧
def search(nums, start, end, target):if start > end:return -1#start, end = 0, len(nums) -1mid = (start + end)//2if nums[mid] > target:return search(nums, start, mid, target)if nums[mid] == target:return midif nums[mid] < target:return search(nums, mid, end, target)#my_solution = Solution()
nums = [1,2,3,4,5,6]
target = 2
start, end = 0, len(nums) -1
targetIndex = search(nums, start, end, target)
print(targetIndex)'''#二分法,模板实现
class Solution:def binarySearch(self, nums, target):if len(nums) == 0:return -1start, end = 0, len(nums) -1while (start + 1 < end):mid = (start + end) // 2if nums[mid] < target:start = midelse:end = mid'''这里不能画蛇添足,要不然错了,如果碰到nums[mid] == target情况,end = mid, nums[end]= nums[mid] == target, 跳转到最后,return end了elif nums[mid] > tartet:end = midelse:return mid '''if nums[start] == target:return startif nums[end] == target:return endreturn -1my_solution = Solution()
nums = [1,2,3,4,5,6]
target = 2
targetIndex = my_solution.binarySearch(nums, target)
print(targetIndex)    

为什么要用 start + 1 < end?而不是 start < end 或者 start <= end?

A: 为了避免死循环。二分法的模板中,整个程序架构分为两个部分:

  1. 通过 while 循环,将区间范围从 n 缩小到 2 (只有 start 和 end 两个点)。
  2. 在 start 和 end 中判断是否有解。

start < end 或者 start <= end 在寻找目标最后一次出现的位置的时候,出现死循环。

Q: 为什么明明可以 start = mid + 1 偏偏要写成 start = mid?

A: 大部分时候,mid 是可以 +1 和 -1 的。在一些特殊情况下,比如寻找目标的最后一次出现的位置时,当 target 与 nums[mid] 相等的时候,是不能够使用 mid + 1 或者 mid - 1 的。因为会导致漏掉解。那么为了节省脑力,统一写成 start = mid / end = mid 并不会造成任何解的丢失,并且也不会损失效率——log(n) 和 log(n+1) 没有区别。

认识你是我们的缘分,同学,等等,记得关注我。

微信扫一扫
关注该公众号

lintcode刷题 14. 二分查找,迭代和二分法Python实现相关推荐

  1. leetcode刷题笔记——二分查找

    leetcode刷题笔记--二分查找 目前完成的贪心相关的leetcode算法题序号: 中等:80,81 困难:4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com ...

  2. LeetCode刷题笔记 二分查找 局部有序

    二分查找的局部有序情况 ​ 我们已经知道二分查找是一种在有序数组中查找某一特定元素的查找算法. ​ 那如果一个数组不是整体有序,而是局部有序呢?这时我们就可以通过分治策略,我们在局部有序的区间内进行二 ...

  3. 【Leetcode | 顺序刷题 】二分查找目录

    二分查找 序号 题号 1 29. 两数相除   50. Pow(x, n)   69. x 的平方根                                                   ...

  4. LeetCode面试刷题技巧-二分查找算法代码思路解析

    二分查找的思想 提及二分查找算法,我想大部分人都不陌生,就算不是学计算机的,基本上也都使用过二分查找的思想,不信的话,且听我慢慢为你道来. 不知道你有没有玩过这样一个游戏,猜数字.就是说一个人心里想了 ...

  5. LeetCode面试刷题技巧-二分查找算法(下):通过 LeetCode 学习二分查找算法-销售价值减少的颜色球

    前言 以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟! MATLAB-30天带你从入门到精通 MATLAB深入理解高级教程(附源码) tableau可视化数据 ...

  6. 牛客题霸 二分查找 C++题解/答案

    牛客题霸 二分查找 C++题解/答案 题目描述 请实现有重复数字的有序数组的二分查找. 输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一. 示例1 输入 复制 5, ...

  7. 二、lintcode刷题记录--二叉树的路径和

    LintCode刷题记录---二叉树的路径和(效率可能没有那些专业的高,主要是代码结构比较简单) ) 题目地址:http://www.lintcode.com/zh-cn/problem/binary ...

  8. 算法刷题系列(四)蓝桥杯python算法训练3(下)

    上一次的节点选择算法由于春节过年耽搁了,现在重新补上 上篇链接:算法刷题系列(四)蓝桥杯python算法训练3 - 经验教训 在纷繁复杂的使用了列表来暂存数据之后,发现其实可以利用笔者自己不太常用的字 ...

  9. LeetCode刷题之二分

    二分 二分是十分基础的一个算法,但是二分对于有序元素的查找应用效果十分优秀.由于最近在刷LeetCode,有二分的题目,感觉有不少感受,觉得以前对于二分也没有太重视,毕竟有对应的库函数可以使用,借此机 ...

最新文章

  1. poj2017——Speed Limit
  2. UA MATH524 复变函数9 柯西公式与幂级数展开
  3. 玩转Mixly – 6、Arduino AVR编程 之 文本
  4. php 获取动态时间,PHP 显示动态时间
  5. 解决GetManifestResourceNames()无法读取资源文件
  6. DOM 基础 HTML标签 元素 属性
  7. spring-boot中使用druid连接池
  8. HDU2516 取石子游戏【博弈】
  9. 测测你的杀毒软件强弱等级吧!!!!!
  10. 我自定义安装office 但在ATA计算机考试系统考试时出现“没有正确的安装office” 怎么解决 求解
  11. SpringBoot和hadoop组件Hive的集成
  12. VMware ESXi 6.7注入第三方RAID驱动
  13. python nlp 中文伪原创_人工智能伪原创工具(AI伪原创)
  14. 单片机开发之嵌入式基础
  15. 美通企业日报 | 安踏上半年收入突破148亿元劲增超40%;猎聘8亿元战略投资问卷星...
  16. Flink:No operators defined in streaming topology. Cannot execute.
  17. golang 时间格式化
  18. 全球与中国云浏览器隔离市场深度研究分析报告
  19. 计算机一级汉字录入在线联系,计算机一级考试指导:汉字录入题的操作(3)
  20. 如何冲出当下的低谷期

热门文章

  1. 64位内核开发第14将,路径的相互转换以及获取.
  2. xcode6的项目中虚拟键盘无法弹出
  3. Jdk动态代理 底层源码分析
  4. (转)Spring Boot(三):Spring Boot 中 Redis 的使用
  5. (转)基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍
  6. JavaTPoint .NET 中文教程【翻译完成】
  7. ZetCode 杂项教程
  8. beginnersbook C 语言教程·翻译完成 | ApacheCN
  9. 【目标检测】IoU、GIoU、DIoU、CIoU Loss详解及代码实现
  10. Flutter修仙传第二章:路由详解