搜索插入位置_二分查找_java

搜索插入位置

问题描述

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

测试用例

示例 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

提示:

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

解题思路

二分查找

代码实现

class Solution {
   public int searchInsert(int[] nums, int target) {
       int left = 0;
       int right = nums.length - 1;

       while (left <= right) {
           int mid = left + (right - left) / 2;

           if (nums[mid] == target) {
               return mid;
           } else if (nums[mid] < target) {
               left = mid + 1;
           } else {
               right = mid - 1;
           }
       }

       return right + 1; 

   }
}

难点详解

​ 为什么当目标值不存在于数组中时return的是(right + 1)?

​ 首先明确当目标值不存在于序列中时程序会自然的退出while循环。此时end = begin - 1 。而 当程序最后一次执行while循环时有两种情况:情况一、 nums[mid] < target, 则程序执行left = mid + 1,则退出循环后left = mid + 1,right = mid。情况二、nums[mid] > target, 则程序执行right = mid - 1,则退出循环后right = mid - 1,left = mid。考虑情况一,此时target应插入nums[mid]之后即序列下 标 为(mid + 1)处。而right + 1 = mid + 1,所以应返回(right + 1);考虑情况二,此时target应插在 nums[mid] 之前即序列下标为mid处。而right + 1 = (mid - 1) + 1,所以其返回值也为(right + 1)。

复杂度

时间复杂度:O(logn)

空间复杂度:O(1)

注意事项

​ 为防止在计算mid时由于计算begin + end导致数值溢出此处mid = begin + (end - begin) / 2;

你可能感兴趣的:(leetcode,算法,leetcode,java)