1. 题⽬链接:35.搜索插⼊位置
2. 题⽬描述:
3. 解法(⼆分查找算法):
算法思路:
a. 分析插⼊位置左右两侧区间上元素的特点: 设插⼊位置的坐标为index ,根据插⼊位置的特点可以知道:
• [left, index - 1] 内的所有元素均是⼩于target 的;
• [index, right] 内的所有元素均是⼤于等于target 的。
b. 设left 为本轮查询的左边界, right 为本轮查询的右边界。根据mid 位置元素的信 息,分析下⼀轮查询的区间:
▪ 当nums[mid] >= target 时,说明mid 落在了[index, right] 区间上, mid 左边包括mid 本⾝,可能是最终结果,所以我们接下来查找的区间在[left, mid] 上。因此,更新right 到mid 位置,继续查找。
▪ 当nums[mid] < target 时,说明mid 落在了[left, index - 1] 区间上, mid 右边但不包括mid 本⾝,可能是最终结果,所以我们接下来查找的区间在[mid + 1, right] 上。因此,更新left 到mid + 1 的位置,继续查找。
c. 直到我们的查找区间的⻓度变为1 ,也就是left == right 的时候, left 或者 right 所在的位置就是我们要找的结果。
C++算法代码:
class Solution
{
public:
int searchInsert(vector<int>& nums, int target)
{
int left=0,mid=0,right=nums.size();
while(left<right)
{
mid=left+(right-left)/2;
if(nums[mid]<target)
{
left=mid+1;
}
if(nums[mid]>=target)
{
right=mid;
}
}
return left;
}
};
Java算法代码:
class Solution
{
public int searchInsert(int[] nums, int target)
{
int left = 0, right = nums.length - 1;
while(left < right)
{
int mid = left + (right - left) / 2;
if(nums[mid] < target) left = mid + 1;
else right = mid;
}
// 特判⼀下第三种情况
if(nums[right] < target) return right + 1;
return right;
}
}