LeetCode 每日一题 搜索插入位置 二分法(golang)

题目

在这里插入图片描述

暴力排序

根据题意,这是一个有序数组,可以直接遍历数组与target比较,若相等则返回索引位置,若不存在返回应该被插入的位置

代码

func searchInsert(nums []int, target int) int {
    for i := 0; i < len(nums); i++ {
        if nums[i] == target || nums[i] > target { // 相等或者不存在时
            return i
        } 
    }
    return len(nums)
}

二分法

先来了解二分法思想
二分法查找适用于数据量较大时,但是数据需要先排好顺序

设查找的数组区间为array[low, high])
1.确定该区间的中间位置K
2.将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找
区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]
3.每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间将缩小一半,递归查找即可

本题分析过程:

1.先设定左侧下标 left 和右侧下标 right,再计算中间下标 mid
2.每次根据 nums[mid] 和 target 之间的大小进行判断,相等则直接返回下标,nums[mid] < target 则 left 右移,nums[mid] > target 则 right 左移
3.查找结束如果没有相等值则返回 left,该值为插入位置

代码

func searchInsert(nums []int, target int) int {
    left :=0
    right := len(nums) - 1
    mid := 0                 //初始化
    for left <= right {      
        mid = (left+right)/2       //确定中间位置
        if nums[mid] == target {
            return mid             
        } else if nums[mid] > target {
            right = mid - 1
        }else {
            left = mid + 1     
        }
    }  //nums[mid] 和 target 之间的大小进行判断,相等则直接返回下标,nums[mid] < target 则 left 右移,nums[mid] > target 则 right 左移
    return left   //查找结束如果没有相等值则返回 left
}

猜你喜欢

转载自blog.csdn.net/qq_46595591/article/details/107405099