搜索插入位置--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) {
                // 如果中间位置的元素等于目标值 target
                return m;
                // 则返回中间位置 m,因为已经找到了目标值
            } else if (nums[m] > target) {
                // 如果中间位置的元素大于目标值 target
                j = m - 1;
                // 则将右边界 j 更新为 m - 1,缩小查找范围到左半部分
            } else {
                // 如果中间位置的元素小于目标值 target
                i = m + 1;
                // 则将左边界 i 更新为 m + 1,缩小查找范围到右半部分
            }
        }

        return j + 1;
        // 当循环结束时,说明没有找到目标值
        // 返回 j + 1,这是目标值应该插入的位置
    }
}

注意:

在计算二分法的中间值middle时,要使用 i + (j - i) / 2 而不是 (i + j) / 2 是为了避免整数溢出

你可能感兴趣的:(leetcode,算法,职场和发展)