題目描述:
給定一個 可重復 的 有序數(shù)列 Array,判斷一個數(shù)S是否在數(shù)列中,如果在,找出第一個符合條件的數(shù)的下標。
當時,由于之前沒有研究過算法的問題,再加上緊張,就沒答上來,人家還提示我“邊界問題”。。。其實,找到 與S相等的數(shù)之后,看它的前一位數(shù)是否小于S,如果是小于,那么 S 就是要找的數(shù),否則,在左側較小的數(shù)列部分繼續(xù)找。
代碼實現(xiàn):
<?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 .' 不在數(shù)列中');
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 .' 在數(shù)列中的第'.$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 在數(shù)列中的第13位' (length=25)
*/
哎,其實沒有什么難度,記錄一下自己糟糕的經歷吧。。。