寻找数组变化

给定数组arr = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1],返回第一个1的下标

很明显需要借助于二分查找,二分查找轻微变形就可以实现

第一种思路:二分查找,把数组分成3个部分,left,mid,right,判断mid是否满足要求,是的话,直接退出,否的话处理一边,这个是完全的二分查找的思路

递归实现如下:

def binarySearch(arr,left,right):if left < right:mid = left + (right - left ) //2if arr[mid] == 0:# 这个是递归的出口之一if arr[mid +1] == 1:return mid + 1else:return binarySearch(arr,mid +1,right)else:# 这个是递归的出口之一if arr[mid -1] == 0:return midelse:return binarySearch(arr,left,mid-1)

迭代实现如下:

def binarySearchRecursive(arr):left =0right = len(arr) -1if arr[0] == 1 or arr[-1] == 0 or not arr:return -1# 不会出现left =right,因为在这之前,已经找到了,提前退出了# 循环体条件,有一种形式靠break退出循环while left < right:# 取中位数mid = left + (right - left ) //2# 中位数为0,判断一下,01直接退出,00的话处理右边if arr[mid] == 0:if arr[mid +1] == 1:index = mid + 1breakelse:left = mid +1   # 中位数为1,判断一下,01的话退出,11的话处理左边else:if arr[mid -1] == 0:index = midbreakelse:right = mid-1return index

另外一种思路,我们需要找第一个1,实际上我们是需要寻找的是第一个01,假如一般的切的话,就可能把01给切开了,怎么办?就是不把01切开,假如我们切到mid的是1,那么我们把mid放在和左边一起,假如我们切到的mid是0,那么我们把mid和右边放在一起,那么最后找到的两个元素就一定是01。这样处理代码比较简单,但是假如我们一刀已经切到了我们需要找到的那个1的位置,我们竟然没认出来,然后把他又放了进去,再去找,在最后只剩下2个元素才找到。

# 还有一种思路mid = left + (right - left ) //2
# arr[mid] =0是处理[mid-1:right]
# arr[mid] =1 时处理[left:mid+1]
# 这个的含义就是:剩下处理的数组里总是含有0和1,最后剩余2个时,就是01
def binarySearch2(arr,left,right):if left + 1 == right:index = rightelse:mid = left + (right - left ) //2if arr[mid] == 0:index = binarySearch(arr,mid,right)else:index = binarySearch(arr,left,mid)return index

代码测试:

arr = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1]
left =0
right = len(arr)-1
print(binarySearch(arr,left,right))
print(binarySearchRecursive(arr))
print(binarySearch2(arr,left,right))runfile('D:/share/test/binary_search.py', wdir='D:/share/test')
14
14
14

寻找数组变化:树形结构,分治模型相关推荐

  1. 【通俗易懂】vue-elementul实现树形数据表格,后台返回的扁平化数组进行树形结构转换处理

    效果图 需求是做一个这种的多层级表格,树形数据表格. 大家可能遇到的问题 一种是不知道如何做这种多层级的表格 一种是后台给自己返回的数据不是树形的,也就是没有子父级.全是一条条的扁平化数组.类似这样 ...

  2. JavaScript将数组转为树形结构

    JavaScript将数组转为树形结构 1.需求 后台给了一个这样的数据让咱前端去转换为树形结构(没有重复数据).不多说,先来看看给了一个怎样的数组数据,转换为怎样的树形结构. 服务器传过来的数组 c ...

  3. WebGL树形结构的模型渲染流程

    今天和大家分享的是webgl渲染树形结构的流程.用过threejs,babylonjs的同学都知道,一个大模型都是由n个子模型拼装而成的,那么如何依次渲染子模型,以及渲染每个子模型在原生webgl中的 ...

  4. php list 转tree,PHP 数组转树形结构

    之前写过同样功能的,使用的递归,代码丑陋不堪,偶然发现写的非常好的实现,摘抄如下: 直接上代码 /** * 把返回的数据集转换成Tree * @param array $list 要转换的数据集 * ...

  5. js 数组 转为树形结构

    题目: source = [{id: 1,pid: 0,name: 'body'}, {id: 2,pid: 1,name: 'title'}, {id: 3,pid: 2,name: 'div'}] ...

  6. 树形结构的数据与一维数组数据的相互转换

    在我们做项目时,我们有时需要树形结构的数据进行数据的树形层级展示,或者需要把返回的数据结构数据进行拆解成单层数组形式.下面我们就来总结下这两种方法. 数组转树形结构: var data = [{&qu ...

  7. ios-使用树形结构导航模式

    // 树形结构导航模式 /* 树形结构导航模式也是非常重要的导航模式,它将导航视图控制器(UINavigationController)与表视图(UITableView)结合使用,主要用于构建有从属关 ...

  8. php 二维数组转,PHP二维数组转树形,树形转二维数组

    二维数组转为树形if (!function_exists('tree')) { /** * 二维数组 转为 树形结构 * @author super * @time 2020-12-22 10:25: ...

  9. 树形结构:从二分查找,二叉搜索树寻找最近祖先,从递归到迭代,实现技巧总结

    二分查找,二叉搜索树寻找最近祖先均是典型分治问题,把原问题分成三部分考虑,递归实现简单,迭代实现也比较简单,里面蕴含了一些从从递归到迭代的技巧,注意这里没有使用模拟栈技术. 深究其原因是,这一类型的递 ...

最新文章

  1. ie与firefox兼容文档
  2. 通过 .htaccess 实现缓存策略
  3. mysql从dos界面_从DOS界面进入MYSQL数据库
  4. xp 4g内存补丁_32位操作系统导致电脑可用内存不足4G
  5. P1303 A*B Problem(python3实现)
  6. 数据治理常见的误区有哪些
  7. gerrit push失败问题解决
  8. 2022年全国大学生电子设计竞赛—TI杯模拟电子系统设计专题邀请赛X题
  9. 英文原版jdk 1.8 API文档
  10. 关于DOS/DDOS攻击和防御
  11. 瞬变抑制二极管的选型
  12. ubuntu16.04系统安装nvidia显卡驱动
  13. 谈谈Android中的persistent属性
  14. Spring的AOP的基于AspectJ注解开发——Spring的JDBC的模板的使用——Spring的事务管理
  15. android 进制转换的方法
  16. hhkb java_为什么知乎上这么多人推荐 HHKB,却不反复强调说该键盘不适合大多数程序员?...
  17. 【5】天猫精灵开放平台实验—基于天气查询模板创建开发屏显页面技能
  18. java成熟妇儿,偶见那妇(精典啊)
  19. synchronized 和 AQS
  20. cdn详解 很全面的

热门文章

  1. 双边z变换公式_光通信与数学 傅里叶变换
  2. win7与linux共享文件夹共享,Ubuntu+Win7+Samba实现文件共享
  3. PHP常用 header函数设置HTTP头部示例
  4. 4测试命令_局域网带宽测试工具-iPerf3
  5. linux下执行shell脚本文件,Linux下使用shell脚本自动执行脚本文件
  6. php fpm xcache,php扩展xcache
  7. 安装mysql error 1045_安装MySQL出现1045错误
  8. oracle multi read,解读Oracle12.2体系架构:Filesystem与Multitenant
  9. php屏蔽审查元素,HTML网站右键禁用F12代码 屏蔽审查元素 防止修改页面代码
  10. sql sever 中如何查看某个表的索引_查看执行计划:explain的type