给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。若是目标值不存在于数组中,返回它将会被按顺序插入的位置。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; //要插入的位置 }