Leetcode面试经典150题刷题记录 —— 二分查找篇

Leetcode面试经典150题刷题记录-系列
Leetcod面试经典150题刷题记录------数组 / 字符串篇
Leetcod面试经典150题刷题记录 ------ 双指针篇
Leetcod面试经典150题刷题记录 ------ 矩阵篇
Leetcod面试经典150题刷题记录 ------ 滑动窗口篇
Leetcod面试经典150题刷题记录 ------ 哈希表篇
Leetcod面试经典150题刷题记录 ------ 区间篇
Leetcod面试经典150题刷题记录------栈篇
Leetcod面试经典150题刷题记录------链表篇
Leetcod面试经典150题刷题记录------二叉树篇
Leetcod面试经典150题刷题记录------二叉树层次遍历篇
Leetcod面试经典150题刷题记录------二叉搜索树篇

Leetcode面试经典150题刷题记录 ------ 二分查找篇

    • [1. 搜索插入位置](#1. 搜索插入位置)
    • [2. 搜索二维矩阵](#2. 搜索二维矩阵)

1. 搜索插入位置

题目链接: 搜索插入位置 - leetcode
题目描述:

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

请必须使用时间复杂度为 O(log n) 的算法。
题目归纳:


解题思路:
解法: 搜索插入位置 - leetcode官方题解

python 复制代码
class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = left + (right - left) // 2
			# 此条件不成立时,有nums[mid] >= target,此时left即正确下标
            if nums[mid] < target: 
                left = mid + 1
            else:
                right = mid - 1
        return left

2. 搜索二维矩阵

题目链接: 搜索二维矩阵 - leetcode
题目描述:

给你一个满足下述两条属性的 m x n 整数矩阵:

每行中的整数从左到右按非严格递增顺序排列。

每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false
题目归纳:


解题思路:
解法: 搜索二维矩阵 - leetcode官方题解

python 复制代码
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        row = self.binarySearchFirstRow(matrix, target)
        print(row)
        if row < 0:
            return False
        return self.binarySearch(matrix[row], target)
    
    def binarySearchFirstRow(self, matrix: List[List[int]], target: int) -> int:
        top, bottom = 0, len(matrix) - 1

        while top < bottom:
            mid = top + (bottom - top + 1) // 2 # 这样mid会更偏向bottom,从而可以最终使top = bottom使循环终止
            if matrix[mid][0] <= target:
                top = mid # 由于top不存在+1操作,所以不能用top <= bottom,很可能top一直等于bottom
            else:
                bottom = mid - 1
        return top

    def binarySearch(self, array:List[int], target):
        left, right = 0, len(array) - 1

        while left <= right:
            mid = left + (right - left) // 2
            if array[mid] == target:
                return True
            elif array[mid] < target:
                left = mid + 1
            elif array[mid] > target:
                right = mid - 1

        return False

关于二分查找的下标和写法问题,请看文章[1]

参考文章与视频链接
[1]数据结构与算法 ------ 常用算法模版
相关推荐
田梓燊6 小时前
力扣:23.合并 K 个升序链表
算法·leetcode·链表
re林檎6 小时前
算法札记——4.27
算法
AI人工智能+电脑小能手7 小时前
【大白话说Java面试题】【Java基础篇】第15题:JDK1.7中HashMap扩容为什么会发生死循环?如何解决
java·开发语言·数据结构·后端·面试·哈希算法
数据牧羊人的成长笔记7 小时前
逻辑回归与Softmax回归
算法·回归·逻辑回归
郑州光合科技余经理7 小时前
同城O2O海外版二次开发实战:从支付网关到配送算法
开发语言·前端·后端·算法·架构·uni-app·php
Moment9 小时前
2026 年,AI 全栈时代到了,前端简历别再只写前端技术了 🫠🫠🫠
前端·后端·面试
白晨并不是很能熬夜9 小时前
【PRC】第 2 篇:Netty 通信层 — NIO 模型 + 自定义协议 + 心跳
java·开发语言·后端·面试·rpc·php·nio
d111111111d10 小时前
STM32-UART封装问题解析
笔记·stm32·单片机·嵌入式硬件·学习·算法
Jiangxl~12 小时前
IP数据云如何为不同行业提供精准IP查询与风险防控解决方案?
网络·网络协议·tcp/ip·算法·ai·ip·安全架构
M ? A12 小时前
Vue 的 scoped 样式穿透 React 不支持?用 VuReact 编译就行
前端·javascript·vue.js·react.js·面试·开源·vureact