【刷题笔记】数组 - 二分查找

循环不变量:区间的定义就是不变量,在while循环中每一次边界的处理都要坚持根据区间的定义来操作。

循环条件的两种写法(根据心情选一种即可):

  1. 左闭右闭[left, right] → 边界处理:right = mid - 1
  2. 左闭右开[left, right) → 边界处理:right = mid

循环体的两种写法(根据题目问法选择对应写法):

  1. 问某个值在不在区间里

    每个mid做等于、大于、小于三次判断,等于时返回

    704.二分查找

    func search(nums []int, target int) int {
        lo, hi := 0, len(nums) - 1
        for lo <= hi {
            mid := lo + (hi - lo) / 2
            if nums[mid] == target {
                return mid
            }
            if nums[mid] < target {
                lo = mid + 1
            } else {
                hi = mid - 1
            }
        }
        return -1
    }
    

    367.有效的完全平方数

    func isPerfectSquare(num int) bool {
        lo, hi := 0, num 
        for lo <= hi {
            mid := lo + (hi - lo) / 2
            if mid * mid == num {
                return true
            } 
            if mid * mid < num {
                lo = mid + 1
            } else {
                hi = mid - 1
            }
        }
        return false
    }
    
  2. 找到第一个大于等于x(最后一个小于等于x)的下标

    每个mid做大于等于、小于(大于、小于等于)两次判断,循环结束返回leftleft - 1

    35.搜索插入位置

    func searchInsert(nums []int, target int) int {
        lo, hi := 0, len(nums) - 1
        for lo <= hi {
            mid := lo + (hi - lo) / 2
            if nums[mid] >= target {
                hi = mid - 1
            } else {
                lo = mid + 1
            }
        }
        return lo
    }
    

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

    func binarySearch(nums []int, target int) int {
        lo, hi := 0, len(nums) - 1
        for lo <= hi {
            mid := lo + (hi - lo) / 2
            if nums[mid] >= target {
                hi = mid - 1
            } else {
                lo = mid + 1
            }
        }
        return lo
    }
    
    func searchRange(nums []int, target int) []int {
        if len(nums) <= 0 {
            return []int{-1, -1}
        }
    
        s := binarySearch(nums, target)
        if s >= len(nums) || nums[s] != target {
            return []int{-1, -1}
        }
        
        e := binarySearch(nums, target + 1) - 1
        return []int{s, e}
    }
    

    69.x 的平方根

    func mySqrt(x int) int {
    lo, hi := 0, x + 1
    for lo < hi {
        mid := lo + (hi - lo) / 2
        if mid <= x / mid { // 避免乘法溢出,用除法
            lo = mid + 1
        } else {
            hi = mid 
        }
    }
    return lo - 1
    }
    

参考视频:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili

  • 29
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为你介绍Python中的数组。 在Python中,数组是一种存储元素的数据结构。与列表不同,数组是固定大小的,且元素类型必须相同。 要使用数组,需要先导入array模块。下面是一个创建数组的示例: ```python import array as arr # 创建一个整数类型的数组 a = arr.array('i', [1, 2, 3, 4, 5]) # 打印数组 print(a) ``` 在上面的示例中,我们使用了`array`模块创建了一个整数类型的数组,并初始化了它。要注意的是,第一个参数是一个字符,用于指定数组元素的类型。在本例中,我们使用了`i`,表示整数类型。 除了整数类型之外,还有其他类型可以使用,如`f`表示浮点数,`d`表示双精度浮点数,`b`表示布尔类型等。 在数组中,可以使用索引来访问元素,如下所示: ```python import array as arr # 创建一个整数类型的数组 a = arr.array('i', [1, 2, 3, 4, 5]) # 访问数组中的第一个元素 print(a[0]) # 修改数组中的第二个元素 a[1] = 6 # 打印数组 print(a) ``` 在上面的示例中,我们使用了索引`0`来访问数组中的第一个元素,使用索引`1`来修改数组中的第二个元素。 除了使用索引来访问和修改元素外,还可以使用循环来遍历数组中的所有元素,如下所示: ```python import array as arr # 创建一个整数类型的数组 a = arr.array('i', [1, 2, 3, 4, 5]) # 遍历数组中的所有元素 for i in a: print(i) ``` 在上面的示例中,我们使用了`for`循环来遍历数组中的所有元素,并打印每个元素的值。 这就是Python中数组的基本用法。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值