leetcode题目链接

1. 题目

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

请必须使用时间复杂度为 O(log n) 的算法。
示例一:

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

示例二:

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

示例三:

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

提示:

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

2. 思路

注意:以后大家只要看到面试题里给出的数组是有序且无重复数组,都可以想一想是否可以使用二分法。

这道题目,要在数组中插入目标值,无非是这四种情况
image.png

  • 目标值在数组所有元素之前
  • 目标值等于数组中某一个元素
  • 目标值插入数组中的位置
  • 目标值在数组所有元素之后

这四种情况确认清楚了,就可以尝试解题了

同样的:我们设定区间是左闭右闭[left,right]

3. 代码

public int search(int[] array, int target){

        int left = 0, right = array.length-1;
        int middle = 0;

        while (left <= right){
            middle = left + ((right - left) >> 1);
            if (array[middle] > target){
                right = middle - 1;
            } else if (array[middle] < target){
                left = middle + 1;
            } else {
                return middle;
            }
        }

        // 分别处理如下四种情况
        // 目标值在数组所有元素之前  [0, -1]
        // 目标值等于数组中某一个元素  return middle;
        // 目标值插入数组中的位置 [left, right],return  right + 1
        // 目标值在数组所有元素之后的情况 [left, right], return right + 1
        return right + 1;
    }