LeetCode 35. 搜索插入位置

80 阅读1分钟

35. 搜索插入位置

难度 简单

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 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

示例 4:

输入: nums = [1,3,5,6], target = 0
输出: 0

示例 5:

输入: nums = [1], target = 0
输出: 0

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums无重复元素升序排列数组
  • -104 <= target <= 104

题解

这道题同样是一个查找的题目,题目同样是一道查找的题目,给出的也是有序数组,可用二分进行查找。

  • 当nums[mid]=target时,返回mid
  • 当nums[mid]<target时,所要查找的值在mid的右边,更新low=mid+1
  • 当nums[mid]>target时,所要查找的值在mid的左边,更新heigh=mid-1

但是有特殊的条件,如果不在数组中就返回合适的位置。这个条件的话,在返回时候特殊处理一下,平时我们返回一般都是mid,但是mid在跳出while循环的时候就出现问题了,mid还是上次的值,在最后返回的时候要进行条件判断。

  • 如果nums[mid]>=target时,返回mid
  • 如果nums[mid]<target时,返回mid+1
int searchInsert(int* nums, int numsSize, int target){
    int low=0;
    int heigh=numsSize-1;
    int mid;
    while(low<heigh){
        mid=low+(heigh-low)/2;//防止溢出
        if(nums[mid]==target){
            return mid;
        }else if(nums[mid]>target){
            heigh=mid-1;
        }else{
            low=mid+1;
        }
    }
    mid=low+(heigh-low)/2;
    if(nums[mid]==target){
            return mid;
    }else if(nums[mid]>target){
        return mid;//如果nums[mid]<target时,返回mid+1
    }else{
        return mid+1;//如果nums[mid]<target时,返回mid+1
    }
}