搜索插入位置--LeetCode
题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 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
class Solution {public int searchInsert(int[] nums, int target) {int i = 0;// 初始化变量 i 为 0,i 表示二分查找的左边界int j = nums.length - 1;// 初始化变量 j 为数组 nums 的最后一个元素的索引,j 表示二分查找的右边界int m;// 声明变量 m,用于存储二分查找过程中的中间位置while (j < nums.length && i <= j) {// 开始一个 while 循环,循环条件为 j 小于数组长度且 i 小于等于 j// 只要满足这个条件,就会继续执行二分查找m = i + (j - i) / 2;// 计算中间位置 m,使用 i + (j - i) / 2 而不是 (i + j) / 2 是为了避免整数溢出if (nums[m] == target) {// 如果中间位置的元素等于目标值 targetreturn m;// 则返回中间位置 m,因为已经找到了目标值} else if (nums[m] > target) {// 如果中间位置的元素大于目标值 targetj = m - 1;// 则将右边界 j 更新为 m - 1,缩小查找范围到左半部分} else {// 如果中间位置的元素小于目标值 targeti = m + 1;// 则将左边界 i 更新为 m + 1,缩小查找范围到右半部分}}return j + 1;// 当循环结束时,说明没有找到目标值// 返回 j + 1,这是目标值应该插入的位置}
}
注意:
在计算二分法的中间值middle时,要使用 i + (j - i) / 2 而不是 (i + j) / 2 是为了避免整数溢出