当前位置:网站首页>第十二届蓝桥杯《杨辉三角》-二分法
第十二届蓝桥杯《杨辉三角》-二分法
2022-08-08 12:19:00 【算法与编程之美】
1 引言
在二分查找(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是用来在一个有序数组中查找某一元素的算法。
二分法的运用原理:以在一个升序(递增的序列)数组中查找一个数为例,每次考察数组当前部分的中间元素,如果中间元素刚好是要找的,就结束搜索过程;如果中间元素小于所查找的值,那么左侧的只会更小,不会有所查找的元素,只需到右侧查找;如果中间元素大于所查找的值同理,只需到左侧查找。
2 问题描述
图2.1
3 算法描述
通过评测用例规模可以知道,问题时间复杂度为N(109),不能直接暴力解决,那么就需要寻找规律,利用其它算法解答。
根据杨辉三角定义可知,其数值是二项式系数(组合数)在三角形中的几何排列(n的数值为第n行),根据题目要求可知,输出答案为第一次出现的位置,根据图3.1可知,只需求解左半部分即可。
图3.1
(3)根据观察图3.1可知,每一个斜行是依次递增,同时再横向观察可知,组合数越靠近中间,数值越大,那么同理可得,位置越靠下方,数值便越大,因此,在解决此问题时,应该从下方开始寻找,同时可知,第1斜行的1=C(0,0),第二斜行的2=C(2,1),第三斜行的6=C(4,2),第四斜行的20=C(6,3),那么第i斜行的起始位置 =C(2n,n),同理,根据计算可知C(34,17)= 2×109 而C(32,16)< 108所以可以从16行开始枚举,枚举到相对于所求值小但大于下一斜行起始值,找到斜行起始值,开始使用二分法查找,因为斜行满足递增序列。
(4)寻求的位置,可以在查找的时候确定,N所在行 n和所在斜行 k ,然后通过等差公式 n*(n+1)/2 计算它之前数目的个数再加上 k+1。
(5)例如:输入整数N = 15,开始从16行枚举,只需枚举到第3斜行起始值 = 6, k = 2 ,开始二分斜行,得到实际行n = 6,因此需要k+1,结果 ans = 6*(6+1)/2 + 2 + 1 = 24。
4代码
| n = int(input()) def C(a,b): #求组合数 res = 1 i = a for o in range(1,b+1): res = res *i / o i -=1 if res > n: return res return res def check(k): #二分查找(需要找到边界值) #左边界2k,右边界为max(l, n)取二者最大,避免右边界小于左边界 left = 2*k right = max(n,left) while left < right: mid = left + right >> 1 if C(mid,k) >= n: right = mid else: left = mid + 1 if C(right,k) != n: return False print(int((right+1)*right//2+k+1)) return True k = 16 for i in range(k): k -=1 if(check(k)): break |
5 结语
通过解答简单的示列问题,可以充分了解到二分算法的基本原理以及思考问题的思路。
边栏推荐
- vim /etc/profile 写入时 出现 E121:无法打开并写入文件解决方案
- odps sql被删除了,能找回来吗
- Kunpeng Developer Creation Day 2022: Kunpeng Full-Stack Innovation and Developers Build Digital Hunan
- MySQL----索引
- 为你的网站加上live2d的动态小挂件,博君一晒
- 你的 golang 程序正在悄悄内存泄漏
- 如何上线TB级推荐模型
- day02 -DOM—高级事件(注册事件、事件监听、删除事件、DOM事件流、事件对象、阻止默认行为、阻止事件冒泡、事件委托)—常用鼠标事件—常用的键盘事件
- 面试官问你什么是长轮询?
- 详解轮播图二-通过left定位来轮播图片
猜你喜欢

STM32的内存管理相关(内存架构,内存管理,map文件分析)

神经网络分类

别再到处乱放配置文件了!试试我司使用 7 年的这套解决方案,稳的一秕

华中科大提出VGNetG:“不做选择,全都要”轻量化主干网络!
MySQL database storage series (5) the InnoDB storage format

shell基础知识合集

报错 | Cannot find module ‘@better-scroll/core/dist/types/BScroll‘

安装MinGW-w64

C语言的三个经典题目:三步翻转法、杨氏矩阵、辗转相除法

史上最全JVM性能调优:线程+子系统+类加载+内存分配+垃圾回收
随机推荐
#yyds Dry Goods Inventory#【Yugong Series】August 2022 Go Teaching Course 005-Variable
Combining "xPlus" to discuss the innovation and change of software architecture
处理器的调试接口
day01 -Web API介绍—DOM 介绍—获取元素—事件基础—操作元素—排他操作—自定义属性操作—节点操作—案例:动态生成表格—创建元素的三种方式(经典面试题)
京东云无线宝产品部负责人张晓东 : 京东云无线宝与开源的亲密关系 | 《大神详解开源 BUFF 增益攻略》讲座回顾...
字节跳动资深架构师整理2022年秋招最新面试题汇总:208页核心体系
Jenkins - 持续集成介绍(1)
MySQL database storage series (5) the InnoDB storage format
Supervisor 后台进程管理
详解轮播图二-通过left定位来轮播图片
curl获取harbor镜像仓库项目下的镜像列表
海外邮件发送指南(一)
期货开户的交易通道和后续服务
[Horizon Rising Sun X3 Trial Experience] WIFI connection, SSH login, TogetherROS installation (section 2)
Yizhou Financial Analysis | Internet-based small loan platform intensively increased capital; comprehensive evaluation index of bank wealth management subsidiaries released in the first half of the ye
Jenkins-安装(2)
面试官问你什么是长轮询?
LeetCode 219. Repeating Elements II (2022.08.07)
OFD是什么
【重构map】【重构filter】【重构Some】【重构reduce方法】【重构flat函数】

