本文最后更新于:4 个月前

题目描述

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

你可以假设数组中无重复元素。

示例 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) {
        if(nums == null || nums.length == 0){
            return 0;
        }

        //考虑边界情况
        if(target < nums[0]){
            return 0;
        }
        if(target == nums[nums.length -1]){ 
            return nums.length-1;
        }
        if (target > nums[nums.length - 1]) { //正序,判断最后一位数是否比目标值小
            return nums.length; //如果大,直接返回数组长度
        }

        int index = 0;
        for (int i = 0; i < nums.length-1; i++) {
            if(nums[i] == target){
                return i;
            }
            if ((nums[i] < target && nums[i+1] > target)) { //相邻的两个数比较
                return i+1;
            }
        }

        return index;
    }
}

二分查找

class Solution {
    public int searchInsert(int[] nums, int target) {
        // 不需要额外考虑数组为空的情况,因为此时low(0)<=low(-1)不成立,直接返回0
        int low = 0, high = nums.length - 1, mid = 0;
        while(low <= high) {
            mid = (low + high) >> 1;
            if(nums[mid] == target)
                return mid;
            else if(nums[mid] > target)
                high = mid - 1;
            else
                low = mid + 1;
        }
        return low;
    }
}

精选题解

踩坑

实验室一兄弟使用js提交,但是遇到了这样的问题

let mid = (hi + lo) >> 1;改为let mid = (hi + lo) / 2;

结果不通过UyWzvt.gif

  • let mid = (hi + lo) >> 1;

UyRjXV.png

  • let mid = (hi + lo) / 2;

UyWFpR.png

请路过的大佬,能不能解决?欢迎评论/私信我!!!


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

本站已接入音乐播放器API 上一篇
正则表达式及工具 下一篇

 目录