PHP二分查詢

大眼小眼發表於2020-08-02

題目:在排序陣列中查詢元素的第一個和最後一個位置

給定一個按照升序排列的整數陣列 nums,和一個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。你的演算法時間複雜度必須是 O(log n) 級別。
如果陣列中不存在目標值,返回 [-1, -1]。

示例 1:
輸入: nums = [5,7,7,8,8,10], target = 8
輸出: [3,4]
示例 
2: 輸入: nums = [5,7,7,8,8,10], target = 6 輸出: [-1,-1] 來源:力扣(LeetCode) 連結:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array 著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

這是屬於查詢型別的題目,因為陣列是一個升序排列的整數叔組所以很容易想到使用二分查詢這種思想來實現 O(log n) 級別的效率獲取答案結果。程式碼如下

 1 class Solution {
 2 
 3     /**
 4      * @param Integer[] $nums
 5      * @param Integer $target
 6      * @return Integer[]
 7      */
 8     function searchRange($nums, $target) {
 9         $len = count($nums);
10         $r = $len;
11         $l = 0;
12         $middle = 0;
13         $found = false;
14         while ($l <= $r && !$found) {
15             $middle = floor($l+($r-$l)/2); //這裡是我想寫這一篇部落格的原因
16             switch (true) {
17                 case $nums[$middle] > $target:
18                     $r = $middle - 1; break;
19                 case $nums[$middle] < $target:
20                     $l = $middle + 1; break;
21                 default : $found = true; break;
22             }
23         }
24         if ($nums[$middle] !== $target) {
25             return [-1, -1];
26         } else {
27             for ($l=$middle; $l>0&&$nums[$l-1]==$target;){
28                 $l--;
29             }
30             for ($r=$middle; $r<$len-1&&$nums[$r+1]==$target;){
31                 $r++;
32             }
33             return [$l, $r];
34         }
35     }
36 }

但是在完成這個題目的時候我更瞭解了 PHP 的一個語言特性:

“變數的型別通常不是由程式設計師設定的,確切地說,是由 PHP 根據該變數使用的上下文在執行時決定的。”  PHP官方文件 

所以對資料進行二分時,變數型別可能從整數型別轉化為浮點數型別。這個也算是 PHP 咒語的一個特點,所以這裡記錄下。

相關文章