二分-不止是查找哦

二分过程:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。(摘自百度百科)

很显然,使用二分查找需要满足两个要求

1.必须采用顺序存储结构

2.必须按关键字大小有序排列。

不断缩小一半的范围,所以时间复杂度O(logn).

贴出有序数组中二分查找的代码

int bsearchWithoutRecursion(int array[],int low,int high,int target)
{while(low<=high){int mid=low+(high-low)/2;/*使用(low+high)/2会有整数溢出的问题(问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)不存在这个问题*/if(array[mid]>target)high=mid-1;else if(array[mid]<target)low=mid+1;else return mid;}return-1;
}

一、淘汰一半即可

进一步:二分搜索算法不一定只能在有序数组中进行,只要你在查找的时候发现可以很确定的淘汰数组的一半,留下另一半,那么都是可以用二分搜索的。

来一道水题来说明。

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

链接https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=11159&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路:因为旋转过去的都大于右边的。

设左右端点,中间位置大于右边说明中间位置为旋转过去的,最小值在右边,向右继续查找;

否则说明中间位置为未旋转区域,最小值在左边,向左查找。

继续

来看题:

本题一般思路:依次查找找到比前后都小的数;或者选出最小数,他肯定是局部最小的;等等

但这些都是O(n)的方法,而用二分可以做到O(logn).

二分思路:

考虑最左和最右的元素:如果arr[0]<arr[1]  return 0; arr[N-1]<arr[N-2] return N-1;

考虑最中间元素,如果中间元素大于它左边的元素,那么局部最小值就应该在数组的左半部分

如果中间元素小于大于它右边的元素,那么局部最小值就应该在数组的右半部分

中间元素既小于它左边的值又小于它右边的值,那么它就是局部最小

最大化或最小化问题

如果在求解最大最小问题中,能比较简单的判断某个解是否满足条件(这里的简单一般指的是o(n)及以下,视具体数据范围而定),使用二分搜索答案就能很好的解决问题。

举个例子,POJ1064

题目链接:http://poj.org/problem?id=1064

题目大意:有n条绳子,长度分别为L[i]。如果从他们中切割出k条长度相同的绳子的话,这k条绳子每条最长能有多长?(答案保留小数点后两位,规定1单位长度的绳子最多可以切割成100份)。

思路:二分搜索答案,每条最短0,最大设置一个较大的数,然后开始二分答案并依次判断,判断也很简单,判断每个绳子的长度整除答案的累加和是不是大于k就好了。

#include <cstdio>
#include <cmath>
using namespace std;
const int M=10005;
const double inf=200005.0;
double L[M];
int n,k;
bool judge(double x)//判断解是否可行
{int num=0;for(int i=0;i<n;i++)num+=(int)(L[i]/x);return num>=k;
}
void solve()//二分答案
{double left=0,right=inf;for(int i=0;i<100;i++) //代替while(r>l) 避免了精度问题{ //1次循环可以把区间缩小一半,100次可以达到10^(-30)的精度double mid=(left+right)/2;if(judge(mid)) left=mid;else right=mid;}printf("%.2f\n",floor(right*100)/100);
}
int main()
{while(scanf("%d%d",&n,&k)!=-1){for(int i=0;i<n;i++)scanf("%lf",&L[i]);solve();}
}

POJ2456

题意:

有n个牛栏,选m个放进牛,相当于一条线段上有 n 个点,选取 m 个点,

使得相邻点之间的最小距离值最大

思路:和上一道题类似,二分答案,判断答案也很简单,贪心即可,遍历,遇到大于枚举的距离就放一只牛,看最后能不能放得下。

代码不贴了

最大化平均值

刚开始做这种题的时候,只知道没有按单位价值贪心那么简单,因为物体质量越大它占的比重越大,对总体的影响就越大。单位价值=总价值/总质量,

二分查找及一般拓展总结相关推荐

  1. Java语言实现二分查找(可查询重复数据)

    文章目录 二分查找 1.前言 2.算法思想 3.图示 4.优缺点 5.代码实现 标准二分查找 拓展:可以查询重复值 二分查找 1.前言 二分查找是一种查询效率非常高的查找算法,又称为折半查找. 用递归 ...

  2. 90%的程序员都写错的算法-二分查找万能模版

    新的角度看二分 二分就是将数组分为两段 因此,问题的最终目标是找出蓝红边界 朴素算法 红色指针一开始指向最右超出范围处,随后不断向左移动,直到找到蓝红边界:或者蓝色指针- 时间复杂度O(n)O(n)O ...

  3. 代码随想录Day01:数组理论基础、二分查找、移除元素

    目录 数组理论基础.二分查找.移除元素 1.数组理论基础 2.Leetcode704.二分查找 方法一 左闭右闭: 方法二 左闭右开: 方法三 左开右开: 方法四 左开右闭: 3.Leetcode27 ...

  4. 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)

    数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...

  5. 二分查找法。Java泛型设计二分查找法。

    前言基础: 1.只能针对有序的数组进行查找. 2.时间复杂度为O(logn). 3.使用前可以先排序,然后再查找,广泛应用于当一大组数据需要频繁查找,于是我们先将其进行排序,然后再通过二分查找进行查找 ...

  6. 【javascript算法】二分查找法

    目录 1.二分查找算法 1.1定义 1.2流程图 1.3查找过程 2.javascript的实现 2.1 源码 2.2测试结果 2.3拓展题 1.二分查找算法 本文是根据有序数组升序的顺序来实现的 1 ...

  7. 二分查找(折半查找)详解

    二分查找详解 1. 二分查找的引入 2. 二分的一些基本知识 1) 定义 2) 特点 3. 二分查找的边界问题 1) 常用模板 2)综合练习 4.二分的应用 1) Flyer 2) Distribut ...

  8. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  9. LeetCode简单题之二分查找

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

最新文章

  1. 小白也能看懂的教程:微信小程序在线支付功能开通详细流程(图文介绍)
  2. 硕士毕业两年算法工程师年终总结
  3. CentOS安装vim及基本配置
  4. python plot方法的使用_【python】matplotlib.pyplot入门
  5. boost::log模块实现将日志记录初始化到远程 syslog 服务器
  6. JupyterNotebook随记(part1)--打开默认目录
  7. 海驾学车过程全揭秘——第九篇:科目三集训及考试
  8. 说说说vue.js中的组
  9. python中的字符数字之间的转换函数
  10. 个人博客系统的设计与实现
  11. HCIA~以太网链路聚合与交换机堆叠、集群
  12. python3 删除指定的PPT页,根据关键词是否删除PPT页在这里插入代码片
  13. c语言拆礼盒,拆礼盒、个人中心功能优化
  14. wps思维导图聚焦模式是灰色不能用的解决方案
  15. 计算机科学与技术寒假社会实践,计算机科学与技术专业寒假社会实践报告.doc...
  16. 开发人员各级岗位胜任力模型
  17. verilog学习|《Verilog数字系统设计教程》夏宇闻 第三版思考题答案(第五章)
  18. JS简单实现:根据奖品权重计算中奖概率实现抽奖的方法
  19. PTA-就不告诉你(C语言)
  20. conj在c语言中什么意思,关于conj是什么词性

热门文章

  1. 使用openssh-clients的scp命令来传输文件
  2. php apache配置测试端口,详解安装配置Windows版apache服务器及压力测试
  3. 上位机与1200组态步骤_组态王与 I/O 设备
  4. 三层架构学习的困难_“网工起航计划”3天集训营 带你了解大型企业网络架构设计!...
  5. 【转】C#中枚举类型与静态变量
  6. .NET异步程序设计之任务并行库
  7. 各类锁(互斥锁,自旋锁,读写锁,乐观锁,悲观锁,死锁)
  8. “菜”鸟理解.NET Framework(CLI,CLS,CTS,CLR,FCL,BCL)
  9. 第七节:Trigger(SimpleTrigger、CronTrigger)哑火(MisFire)策略 :
  10. 一步步编写操作系统81 att内嵌汇编语法