寻找数组变化:树形结构,分治模型
寻找数组变化
给定数组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
寻找数组变化:树形结构,分治模型相关推荐
- 【通俗易懂】vue-elementul实现树形数据表格,后台返回的扁平化数组进行树形结构转换处理
效果图 需求是做一个这种的多层级表格,树形数据表格. 大家可能遇到的问题 一种是不知道如何做这种多层级的表格 一种是后台给自己返回的数据不是树形的,也就是没有子父级.全是一条条的扁平化数组.类似这样 ...
- JavaScript将数组转为树形结构
JavaScript将数组转为树形结构 1.需求 后台给了一个这样的数据让咱前端去转换为树形结构(没有重复数据).不多说,先来看看给了一个怎样的数组数据,转换为怎样的树形结构. 服务器传过来的数组 c ...
- WebGL树形结构的模型渲染流程
今天和大家分享的是webgl渲染树形结构的流程.用过threejs,babylonjs的同学都知道,一个大模型都是由n个子模型拼装而成的,那么如何依次渲染子模型,以及渲染每个子模型在原生webgl中的 ...
- php list 转tree,PHP 数组转树形结构
之前写过同样功能的,使用的递归,代码丑陋不堪,偶然发现写的非常好的实现,摘抄如下: 直接上代码 /** * 把返回的数据集转换成Tree * @param array $list 要转换的数据集 * ...
- js 数组 转为树形结构
题目: source = [{id: 1,pid: 0,name: 'body'}, {id: 2,pid: 1,name: 'title'}, {id: 3,pid: 2,name: 'div'}] ...
- 树形结构的数据与一维数组数据的相互转换
在我们做项目时,我们有时需要树形结构的数据进行数据的树形层级展示,或者需要把返回的数据结构数据进行拆解成单层数组形式.下面我们就来总结下这两种方法. 数组转树形结构: var data = [{&qu ...
- ios-使用树形结构导航模式
// 树形结构导航模式 /* 树形结构导航模式也是非常重要的导航模式,它将导航视图控制器(UINavigationController)与表视图(UITableView)结合使用,主要用于构建有从属关 ...
- php 二维数组转,PHP二维数组转树形,树形转二维数组
二维数组转为树形if (!function_exists('tree')) { /** * 二维数组 转为 树形结构 * @author super * @time 2020-12-22 10:25: ...
- 树形结构:从二分查找,二叉搜索树寻找最近祖先,从递归到迭代,实现技巧总结
二分查找,二叉搜索树寻找最近祖先均是典型分治问题,把原问题分成三部分考虑,递归实现简单,迭代实现也比较简单,里面蕴含了一些从从递归到迭代的技巧,注意这里没有使用模拟栈技术. 深究其原因是,这一类型的递 ...
最新文章
- ie与firefox兼容文档
- 通过 .htaccess 实现缓存策略
- mysql从dos界面_从DOS界面进入MYSQL数据库
- xp 4g内存补丁_32位操作系统导致电脑可用内存不足4G
- P1303 A*B Problem(python3实现)
- 数据治理常见的误区有哪些
- gerrit push失败问题解决
- 2022年全国大学生电子设计竞赛—TI杯模拟电子系统设计专题邀请赛X题
- 英文原版jdk 1.8 API文档
- 关于DOS/DDOS攻击和防御
- 瞬变抑制二极管的选型
- ubuntu16.04系统安装nvidia显卡驱动
- 谈谈Android中的persistent属性
- Spring的AOP的基于AspectJ注解开发——Spring的JDBC的模板的使用——Spring的事务管理
- android 进制转换的方法
- hhkb java_为什么知乎上这么多人推荐 HHKB,却不反复强调说该键盘不适合大多数程序员?...
- 【5】天猫精灵开放平台实验—基于天气查询模板创建开发屏显页面技能
- java成熟妇儿,偶见那妇(精典啊)
- synchronized 和 AQS
- cdn详解 很全面的
热门文章
- 双边z变换公式_光通信与数学 傅里叶变换
- win7与linux共享文件夹共享,Ubuntu+Win7+Samba实现文件共享
- PHP常用 header函数设置HTTP头部示例
- 4测试命令_局域网带宽测试工具-iPerf3
- linux下执行shell脚本文件,Linux下使用shell脚本自动执行脚本文件
- php fpm xcache,php扩展xcache
- 安装mysql error 1045_安装MySQL出现1045错误
- oracle multi read,解读Oracle12.2体系架构:Filesystem与Multitenant
- php屏蔽审查元素,HTML网站右键禁用F12代码 屏蔽审查元素 防止修改页面代码
- sql sever 中如何查看某个表的索引_查看执行计划:explain的type