每天一道LeetCode-11(搜索插入位置)

74 阅读1分钟

题目描述

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

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

分析

题目要求算法时间复杂度为logn,因此不能全部依次遍历(时间复杂度为n),于是采用二分法,定义两个指针分别指向头尾,再定义res作为新数组的长度,默认长度为numsSize,当左指针小于等于右指针时,定义指针mid指向中间元素,如果target小于等于mid,即在左侧,res赋值为mid,再将范围缩小,right = mid - 1;如果targe在mid右侧,即大于mid,直接left = mid + 1 即可,最后返回res。

代码实现

int searchInsert(int* nums, int numsSize, int target){
    int left = 0, right = numsSize-1, res = numsSize;
    while(left <= right ){
        //对mid进行向右移动一位,例如 7 >> 1 = 0111 >> 1 = 0011 = 3
        //和 7/2 结果相同,性能更佳
        int mid = ((right - left) >> 1)+left; 
        //在数组左侧
        if(target <= nums[mid]){
            res = mid;
            right = mid-1;
        //在数组右侧
        }else{
            left = mid+1;
        }
    }
    return res;
}