LeetCode#35-Search Insert Position-搜索插入位置
一、题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例1:
输入: [1,3,5,6], 5
输出: 2
示例2:
输入: [1,3,5,6], 2
输出: 1
示例3:
输入: [1,3,5,6], 7
输出: 4
示例4:
输入: [1,3,5,6], 0
输出: 0
二、题解
- 解法1:暴力求解
一开始想的是遍历数组,比较当前元素和目标值,如果相等,就返回当前元素的下标。
可如果数组里没有与目标值相同的元素呢?难不成从头遍历,去找比目标值小的元素么?
因此设置一个 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;
}
- 解法2:二分查找
题目已经给出了关键词——排序数组。那无疑就是用“二分查找”了。二分查找的原理及实现可以参见数据结构与算法之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; //要插入的位置
}
分类:
LeetCode刷题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2018-04-11 ThinkPHP5.0源码学习之缓存Cache(二)