当前位置: 首页 > news >正文

网站如何备案工信局天津百度快照优化公司

网站如何备案工信局,天津百度快照优化公司,免费可商用的图片素材网站,响应式网站404页面怎么做文章目录 二分查找算法简介题目链接:题目描述:解法C 算法代码:图解总结朴素二分模板 二分查找算法简介 特点: 二分查找算法,是最恶心,细节最多,最容易写出死循环的算法。(而且非常难…

文章目录

    • 二分查找算法简介
    • 题目链接:
    • 题目描述:
    • 解法
    • C 算法代码:
    • 图解
    • 总结朴素二分模板


二分查找算法简介

  1. 特点:

    二分查找算法,是最恶心,细节最多,最容易写出死循环的算法。(而且非常难调试)

    不过如果真的掌握了二分算法后,会觉得这个是最简单的算法。

  2. 学习中的侧重点:

  • 算法原理:

    一开始会觉得只有数组有序的情况才能使用二分算法

    但是学到后面,会发现就算无序,只要有规律也可以使用二分算法

  • 模板:

    不要死记硬背,需要理解背后的原理,做到理解后再记忆。

  • 会讲3个模板

    1. 朴素的二分模板
    2. 查找左边界的二分模板
    3. 查找右边界的二分模板

    3个模板加起来不超过20行,可以解决 99.99%的二分题,但不能只背模板。

下面的一题会讲到第一个模板,后一题会讲第二第三个模板。

朴素的二分模板,朴素意味着简单,只有一些非常简单的二分题才用到。

查找左边界的二分模板和查找右边界的二分模板是万能的,也就是朴素模板可以解决的也可以用另外两个解决,不过细节很多。


题目链接:

leetcode 704.二分查找


题目描述:

1be6c7f089504a35d0b597130220a99a


解法

暴力解法:

遍历一遍,时间复杂度O(n)

例如:[1,2,3,4,5,6,7,8],t=5

比如44t小,那么它前面的比4还小,那么全比t小,可以把44之前的数全干掉。

同理,66后面的数也一样可以干掉。

总的来说就是,随便找个端点,只要不是目标值,那么它的一侧可以全部干掉。

1c7ba1675a5cbc7805fffeb318dda1d6

总结来说就是:二段性

就是当我们发现一个规律,然后根据这个规律选取某一个点能把这个数组分成两部分,然后根据规律可以有选择的舍去一部分,进而在另一部分里面继续查找的时候,就可以使用二分查找算法。

注意上面的描述,不管有序无序,只要有二段性都可以使用二分算法。

对于端点的选择,我们可以选择1/2处,1/3处,1/4处等等。我们的目的是找到二段性。

d8950a8df31ada3f3582a16b9524dfb0

所以端点的选择比较多,但是我们一般选1/2的点。在概率学里面是求数学期望。

就像1/3处的点,虽然可能直接把2/3的部分抹除,但是也可能只抹除了1/3

在这么多的端点的划分里面,选择中间这个点的时间复杂度是最好的。

我们可以定义一个left指针,right指针和mid指针

2b69be9afa2c4c0ef9e9f6cb5a26f6e1

3步就是朴素二分算法的核心了。

细节问题:

  1. 循环结束的条件是什么?

    left>right的时候结束循环

    left<=right的时候一直循环

  2. 为什么是正确的?

    通过二段性达到和暴力解法一样的排除作用

  3. 为什么时间复杂度快?

    log2n


C 算法代码:

int search(int* nums, int numsSize, int target)
{// 初始化 left 与 right 指针int left = 0, right = numsSize - 1;// 由于两个指针相交时,当前元素还未判断,因此需要取等号while (left <= right){// 先找到区间的中间元素int mid = left + (right - left) / 2;// 分三种情况讨论if (nums[mid] == target) return mid;else if (nums[mid] > target) right = mid - 1;else left = mid + 1;}// 如果程序走到这里,说明没有找到目标值,返回 -1return -1;
}

图解

例如:[1,2,3,4,5,6,7,8],t=5

  1. left = 0, right =7

    left <= right进入循环

    mid=0+(7-0)/2=3

    feda6fb805921b2070f1e0d230213699

    nums[mid]=4<t

    满足else条件,执行left = mid + 1=4

  2. left = 4, right =7

    left <= right进入循环

    mid=4+(7-4)/2=5

    40df4dd4ef03864fbc9c6b0ff8aa759f

    nums[mid]=6>t

    满足nums[mid] > target条件,执行right = mid - 1=4

  3. left = 4, right =4

    left <= right进入循环

    mid=4+(4-4)/2=4

    335900edd72646f1db635b92cf5efd11

    满足nums[mid] == target)条件,执行return mid;

9f6db2e718b4632e413f5d6b27903163

  1. 程序结束。

总结朴素二分模板

while(left <= right){int mid = left + (right - left) / 2;//int mid = left + (right - left + 1) / 2;//这两个在朴素版本作用一样if(......)left = mid + 1;else if(......)right = mid - 1;elsereturn ......;
}
http://www.shuangfujiaoyu.com/news/25610.html

相关文章:

  • 做正规网站搜索引擎优化的基本原理
  • 社交做的最好的网站百度账号查询
  • 个人可以做几个网站吗百度pc版网页
  • 如何做自己的网站或者论坛seo关键词排名软件
  • 百度收录网站链接统计站老站长推荐草莓
  • pis粉丝做的网站百度seo哪家公司好
  • 谁做网站优秀网页设计作品
  • wordpress 新建侧边栏seo的优缺点
  • 网站数据修改教程在线数据分析工具
  • 个人网站建设优化宁波seo快速优化平台
  • 找人做网站被骗了 算诈骗吗网站里的友情链接
  • 政府信息网站如何建设百度站长seo
  • 小程序服务器多少钱福州seo推广服务
  • 做网站收费标准点击量教育培训加盟
  • 国家工商网企业查询官网seo排名点击软件
  • python flask做网站百度首页排名优化平台
  • 做视频网站需要多少带宽百度站长平台网址
  • 宁波seo推广推荐福州网seo
  • 企业如何做网站推广无锡百度推广代理商
  • winforms做网站深圳经济最新新闻
  • 番禺网站制作企业肇庆seo排名
  • 厦门做网站最好的公司程序员培训机构排名前十
  • 昆明培训网站建设西安计算机培训机构哪个最好
  • 自建网站怎么做二级页跳转全渠道营销成功案例
  • 长春网络公司宣传seo实战密码电子版
  • 中山 网站建设开发衡阳seo排名
  • b2b商场网站建设百度快快速排名
  • 高中信息技术课网站怎么做河北seo网络优化师
  • wordpress 插件下载站谷歌seo是指什么意思
  • 网站控制台网络销售培训