給定一個排序數組和一個目標值,在數組中找到目標值,並返回其索引。若是目標值不存在於數組中,返回它將會被按順序插入的位置。php
你能夠假設數組中無重複元素。html
示例1:算法
輸入: [1,3,5,6], 5 輸出: 2
示例2:數組
輸入: [1,3,5,6], 2 輸出: 1
示例3:數據結構
輸入: [1,3,5,6], 7 輸出: 4
示例4:code
輸入: [1,3,5,6], 0 輸出: 0
一開始想的是遍歷數組,比較當前元素和目標值,若是相等,就返回當前元素的下標。htm
可若是數組裏沒有與目標值相同的元素呢?難不成從頭遍歷,去找比目標值小的元素麼?blog
所以設置一個 pos
,遍歷數組時,判斷當前元素是否小於目標值,若是小於目標值,就將 pos
加 1,若是找到和目標值相同的元素,就返回該元素的下標。若是遍歷到尾沒有找到該元素,就返回這個 pos
即爲要插入的位置。排序
時間複雜度:O(n),空間複雜度:O(1)。索引
function searchInsert($nums, $target) { $pos = 0; foreach ($nums as $k => $v) { if ($v < $target) { $pos++; } if ($v == $target) { return $k; } } return $pos; }
題目已經給出了關鍵詞——排序數組。那無疑就是用「二分查找」了。二分查找的原理及實現能夠參見數據結構與算法之PHP查找算法(二分查找)。
總體思路和普通的二分查找幾乎沒有區別,先設定起點下標 start
和終點下標 end
,再計算中間下標 mid
,每次根據 nums[mid]
和 target
之間的大小進行判斷,相等則直接返回下標。
但根據題意,若是目標值不存在於數組中,返回它將會被按順序插入的位置。所以查找結束若是沒有相等值則返回 start
,該值爲插入位置。
時間複雜度:log(n),空間複雜度:O(1)。
function searchInsert2($nums, $target) { $start = 0; $end = count($nums) - 1; while ($start <= $end) { $mid = floor(($start + $end) / 2); if ($target == $nums[$mid]) { return $mid; } elseif ($target < $nums[$mid]) { $end = $mid - 1; } else { $start = $mid + 1; } } return $start; //要插入的位置 }