【力扣刷题实战】搜索插入位置
大家好,我是小卡皮巴拉
文章目录
目录
力扣题目:搜索插入位置
题目描述
解题思路
问题理解
算法选择
具体思路
解题要点
完整代码(C++)
兄弟们共勉 !!!
每篇前言
博客主页:小卡皮巴拉
咱的口号:🌹小比特,大梦想🌹
作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请大佬们批评斧正。
力扣题目:搜索插入位置
原题链接:35. 搜索插入位置 - 力扣(LeetCode)
题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5 输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2 输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7 输出: 4
解题思路
问题理解
本题要求在一个已排序的数组 nums
中查找目标值 target
,若找到则返回其索引;若未找到,则返回目标值按顺序插入数组时应处的位置。并且要求算法的时间复杂度为 O(logn)。
算法选择
采用二分查找算法。二分查找是一种高效的查找算法,适用于有序数组,它通过不断将搜索区间缩小一半,从而将时间复杂度控制在 O(logn)。
具体思路
-
初始化左右指针:
-
定义两个指针
left
和right
,分别指向数组的起始位置(索引为 0)和结束位置(索引为nums.size() - 1
)。
-
-
二分查找过程:
-
使用
while
循环,当left < right
时,执行以下操作:-
计算中间位置
mid
,为避免整数溢出,使用mid = left + (right - left) / 2
计算。 -
比较
nums[mid]
和target
的大小:-
如果
nums[mid] < target
,说明目标值在mid
的右侧,将left
更新为mid + 1
。 -
如果
nums[mid] >= target
,说明目标值可能在mid
或其左侧,将right
更新为mid
。
-
-
-
-
最终结果判断:
-
当
left
和right
相遇时,循环结束。此时判断nums[left]
和target
的大小:-
如果
nums[left] < target
,说明目标值应插入到left
的下一个位置,返回left + 1
。 -
否则,说明目标值应插入到
left
位置,返回left
。
-
-
解题要点
-
二分查找的实现:正确计算中间位置
mid
,并根据nums[mid]
和target
的大小关系更新左右指针,确保每次迭代都能将搜索区间缩小一半。 -
最终位置的判断:循环结束后,根据
nums[left]
和target
的大小关系确定目标值的插入位置。
完整代码(C++)
class Solution {
public:
int searchInsert(vector<int>& nums, int target)
{
int left = 0, right = nums.size() - 1; // 初始化左右指针,分别指向数组的起始和结束位置
while (left < right) // 当左指针小于右指针时,继续二分查找
{
int mid = left + (right - left) / 2; // 计算中间位置,避免整数溢出
if (nums[mid] < target) // 如果中间元素小于目标值
left = mid + 1; // 目标值在 mid 的右侧,更新左指针
else
right = mid; // 目标值可能在 mid 或其左侧,更新右指针
}
if (nums[left] < target) // 循环结束后,判断目标值的插入位置
return left + 1; // 如果当前位置元素小于目标值,插入到下一个位置
return left; // 否则,插入到当前位置
}
};
兄弟们共勉 !!!
码字不易,求个三连
抱拳了兄弟们!