代码编织梦想

题目链接:
704. 二分查找
27. 移除元素
知识点链接:
数组理论基础

二分法

704. 二分查找

前提条件

数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。

区间定义

左闭右闭[left, right]

右闭的right是一个高富帅,他已经得到了,所以有资格挥霍一个middle,
right = middle - 1
func search(nums []int, target int) int {
    left, right := 0, len(nums) - 1
    for left <= right {
        middle := (left + right)/2
        if nums[middle] > target{
            right = middle - 1
        }else if nums[middle] < target {
            left = middle + 1
        }else{
            return middle
        }
    
    }
    return -1
}

左闭右开[left, right)

右开是个舔狗,得不到的拼命想要握在手中
right = middle
func search(nums []int, target int) int {
    left, right := 0, len(nums)
    for left < right {
        middle := (left + right)/2
        if nums[middle] > target{
            right = middle
        }else if nums[middle] < target {
            left = middle + 1
        }else{
            return middle
        }
    
    }
    return -1
}

left是高冷的女神,全程观战示意挥霍

left = middle + 1

双指针法

27. 移除元素

双向奔赴才是浪漫

  • 自写
func removeElement(nums []int, val int) int {
    left, right := 0, len(nums) - 1
    // 从左向右依次遍历
    for left <= right {
        // 找到第一个val,就将其与右边第一个不是val的位置互换
        if nums[left] == val {
            for left <= right {
                if nums[right] == val{
                    right -= 1
                    continue
                }else {
                    nums[left], nums[right] = nums[right], nums[left]
                    break
                }
            }
        }else {
            left += 1
        }
    }
    return left
}
  • 教程版
    读起来更加简洁,感觉上更加自动化,不累赘。

内层的两个for循环必须也得加上left <= right,否则会溢出来。

func removeElement(nums []int, val int) int {
    left, right := 0, len(nums) - 1
    for left <= right {
        for left <= right && nums[left] != val {
            left ++
        }
        for left <= right && nums[right] == val{
            right -- 
        }
        fmt.Println(left, right)
        if left < right{
            nums[left] = nums[right]
            left ++
            right --
        }
    }
    return left
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43561446/article/details/130840491

最短路径问题-爱代码爱编程

如图,设定源点为D,终点为A,则D到A的最短路径是多少?  算法思路: 第一步,从源点D出发,此时能到达的选择是C和E,我们根据路径长度选择最少的作为下一个节点,于是选择C, 第二步,到达C后,标记C已经走过了,后续再做选择时,排除C。然后将所有C能到达的节点告知D,也就是B、F、E。由D来分辨,B、F、E这些点,是通过C节点路最短,还是D现有方