题目描述: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 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
方法一:
二分查找加分析法
毫无疑问,与查找有关的算法比较优的解法就是二分查找法
算法流程
- 首先定义两个指针l,r,初始值给定,然后进入while循环
- 判断如果数组的第一个数都大于或者等于target,那么ans(存放答案用)的值就是数组第一个下标的l。
- 如果数组的最后一个数都小于target,那么ans=最后一个数的下标值加一
- 如果数字的最后一个数等于target,那么ans=最后一个数的下标
- 计算mid
- 如果中间的nums【mid】==target,则ans=mid;
- 如果nums【mid】>target,数组的搜索范围发生变化,右下标r=mid-1
- 如果nums【mid】<target,同第七步
- 如果循环没有结束,继续判断新的子数组和target的关系
class Solution {
public int searchInsert(int[] nums, int target) {
int l=0;
int r=nums.length-1;
int ans=0;
while(l<=r)
{
if(nums[l]>=target)
{
ans=l;
break;
}
if(nums[r]<target)
{
ans=r+1;
break;
}
if(nums[r]==target)
{
ans=r;
break;
}
int mid=(l+r)/2;
if(nums[mid]==target)
{
ans=mid;
break;
}
else if(nums[mid]>target)
{
r=mid-1;
}
else if(nums[mid]<target)
{
l=mid+1;
}
}
return ans;
}
}
这个算法时间效率很高,但是空间消耗大。
呜呜呜,其实这道题就是二分查找,是我想复杂了,还搞出这么多if判断。
可以在最后直接返回 l(左边界)。
class Solution {
public int searchInsert(int[] nums, int target) {
int l=0;
int r=nums.length-1;
int ans=0;
while(l<=r)
{
int mid=(l+r)/2;
if(nums[mid]==target)
{
return mid;
}
else if(nums[mid]>target)
{
r=mid-1;
}
else if(nums[mid]<target)
{
l=mid+1;
}
}
return l;
}
}
在这里分享一下大佬们总结出来的二分查找 两种模式