二分查找

二分查找

func search(nums []int, target int) int {

    l, r := 0, len(nums) - 1
    mid := 0
    for l <=r { // = 是l 和r 相等的情况
        mid = l + (r-l)>>1 // 防止溢出
        if nums[mid] > target {
            r = mid - 1 // 左半部分
        } else if nums[mid] < target {
            l = mid + 1 // 右半部分
        } else {
            return mid
        }
    }
    return -1

}

在排序数组中查找元素的第一个和最后一个位置

https://leetcode.cn/leetbook/read/top-interview-questions-medium/xv4bbv/


func searchRange(nums []int, target int) []int {

    result := make([]int,2)
    result[0] = findFirst(nums, target)
    result[1] = findLast(nums, target)

    return result

}

func findFirst(nums []int, target int) int {

    l, r := 0, len(nums) - 1
    mid := 0
    for l <= r {
        mid = l + (r-l)>>1
        if nums[mid] > target {
            r = mid - 1
        } else if nums[mid] < target {
            l = mid + 1
        } else {
            if mid == 0 || nums[mid -1 ] != target {
               return mid 
            } else {
                r = mid - 1
            }
        }
    }
    return -1

}


func findLast(nums []int, target int) int {

    l, r := 0, len(nums) - 1
    last := r
    mid := 0
    for l <= r {
        mid = l + (r-l)>>1
        if nums[mid] > target {
            r = mid - 1
        } else if nums[mid] < target {
            l = mid + 1
        } else {
            if mid == last || nums[mid + 1 ] != target {
               return mid 
            } else {
                l = mid + 1
            }
        }
    }
    return -1

}

func searchRangeV1(nums []int, target int) []int {

    l,r := 0, len(nums) - 1
    index := findIndex(nums, l, r , target)
    if index == -1 {
        return []int{-1,-1}
    }
    lindex,rindex := index,index
    for lindex > 0 {
        if nums[lindex-1] == target {
            lindex--
        } else {
            break
        }
    }
    for rindex < r {
        if nums[rindex+1] == target {
            rindex++
        } else {
            break
        }
    }
    if lindex <= rindex {
        return []int{lindex,rindex}
    }
    return []int{-1,-1}

}

func findIndex(nums []int,l,r ,target int) int {
    
    mid := 0
    for l <= r {
        mid = (r-l)/2+l
        if nums[mid] > target {
            r = mid - 1
        } else if nums[mid] < target {
            l = mid + 1
        } else {
            return mid 
        }
    }
    return -1
}

x 的平方根

func mySqrt(x int) int {

    if x == 0 {
        return 0
    }
    l , r := 1, x

    mid := 0
    for l <=r {
        mid = l + (r-l)>>1
        if mid <=x/mid { // 防止溢出
            //看下一个
            if (mid+1) <= x/(mid+1) {
                l = mid + 1
            } else {
                return mid
            }
        } else {
            r = mid - 1
        }

    }

    return -1

}

搜索插入位置

func searchInsert(nums []int, target int) int {

    l, r := 0, len(nums) -1 
    mid := 0
    for l<=r {
        mid = (r-l)>>1 + l 
        if nums[mid] >= target {
            if mid == 0 || nums[mid-1] < target {
                return mid 
            }
            r = mid -1 
        } else {
            l = mid + 1
        }

    }
    return r + 1

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容