-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathmin_num_in_rotated_arr.php
More file actions
42 lines (39 loc) · 1.27 KB
/
min_num_in_rotated_arr.php
File metadata and controls
42 lines (39 loc) · 1.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
/**
* 在旋转数组中寻找最小值
* Author:学院君
*/
/**
* 实现函数
* @param array $numbers
* @return mixed
* @throws Exception
*/
function findMinNum(array $numbers)
{
if (empty($numbers)) {
throw new Exception('无效参数');
}
$mid = $left = 0; // 左指针,中间元素初始指向左指针是为了应付递增数组这种特殊情况
$right = count($numbers) - 1; // 右指针
while ($numbers[$left] >= $numbers[$right]) {
// 当左右指针相邻,循环终止,右侧指针指向的就是最小元素
if ($right - $left == 1) {
$mid = $right;
break;
}
// 中间元素位置计算
$mid = ($left + $right) >> 1;
if ($numbers[$mid] >= $numbers[$left]) {
// 当中间元素位于旋转数组前半部分,则将左指针指向中间元素,缩小查找范围继续查找
$left = $mid;
} elseif ($numbers[$mid] <= $numbers[$right]) {
// 当中间元素位于旋转数组后半部分,则将右指针指向中间元素,缩小查找范围继续查找
$right = $mid;
}
}
// 返回最终查找结果
return $numbers[$mid];
}
$numbers = [5, 1, 2, 3, 4];
var_dump(findMinNum($numbers));