记录曾遇到的一个二分查找问题

题目描述:
给定一个 可重复有序数列 Array,判断一个数S是否在数列中,如果在,找出第一个符合条件的数的下标。

当时,由于之前没有研究过算法的问题,再加上紧张,就没答上来,人家还提示我“边界问题”。。。其实,找到 与S相等的数之后,看它的前一位数是否小于S,如果是小于,那么 S 就是要找的数,否则,在左侧较小的数列部分继续找。

代码实现:

<?php
$arr = [ 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 6, 6, 6, 6, 6, 7 ];

search_num($arr, 4);

function search_num($arr, $search){
    $len = count($arr);
    $start = 0;
    $end = $len-1;
    if($search < $arr[$start] || $search > $arr[$end]){
        var_dump($search .' 不在数列中');
        return;
    }

    while (1) {
        $middle = ceil(($start+$end)/2);
        var_dump('index: '.$middle.', middle: '.$arr[$middle]);

        if($search == $arr[$middle] && $search > $arr[$middle-1]){
            var_dump($search .' 在数列中的第'.$middle.'位');
            return;
        }

        if($search <= $arr[$middle]){
            $end = $middle;
            continue;
        }

        if($search > $arr[$middle]){
            $start = $middle;
            continue;
        }
    }
}

/* 输出结果:
/www/test/sort.php:100:string 'index: 14, middle: 4' (length=20)
/www/test/sort.php:100:string 'index: 7, middle: 3' (length=19)
/www/test/sort.php:100:string 'index: 11, middle: 3' (length=20)
/www/test/sort.php:100:string 'index: 13, middle: 4' (length=20)
/www/test/sort.php:103:string '4 在数列中的第13位' (length=25)
*/

哎,其实没有什么难度,记录一下自己糟糕的经历吧。。。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 14,022评论 6 13
  • 算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...
    第六象限阅读 10,197评论 0 0
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 11,543评论 1 42
  • 1、熟读,培养文言文的语感 2、蒋老师他每次都要求我们一句一句的翻译 3、对每一个字要多去查古汉字至常用字典,要逐...
    瓦卡卡妈阅读 3,541评论 0 1
  • 这一路走来,遇到了许多人和事,路途的风景也挺美的。 回想起以前读初中的三年时光,自己过得是多么的自由自在,无忧无虑...
    伯乐之家阅读 1,324评论 1 0

友情链接更多精彩内容