当前位置: 首页 > news >正文

初学python的我开始Leetcode题10-3

提示:100道LeetCode热题-10-3主要是二分查找相关,包括三题:搜索插入位置、搜索二维矩阵、在排序数组中查找元素的第一个和最后一个位置。由于初学,所以我的代码部分仅供参考。


前言

才发现原题粘过来黑黑的,改了一下~

最近在学知识图谱,但还是不班门弄斧啦~Leetcode启动!

二分查找(Binary Search)是一种在有序数组中查找特定元素的搜索算法。事实上,在一些理论课上我们早就学会过它,它通过反复将数组分成两半来缩小搜索范围,从而快速找到目标元素。那么怎么运用呢?以下是二分查找的基本步骤:

  1. 确定数组的中间元素。

  2. 将目标值与中间元素进行比较。

  3. 如果目标值等于中间元素,则查找成功。

  4. 如果目标值小于中间元素,则在数组的左半部分继续查找。

  5. 如果目标值大于中间元素,则在数组的右半部分继续查找。

  6. 重复上述步骤,直到找到目标值或搜索范围为空。

二分查找的时间复杂度为 O(logn),其中 n 是数组的长度。这使得二分查找在处理大型数据集时非常高效。


提示:以下是本篇文章正文内容,下面结果代码仅供参考

题目1:搜索插入位置

1.题目要求:

题目如下:

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

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

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

提示:

  • 1 <= nums.length <= 10^{4}
  • -10^{4} <= nums[i] <= 10^{4}
  • nums 为 无重复元素 的 升序 排列数组
  • -10^{4} <= target <= 10^{4}

代码框架已经提供如下:

class Solution(object):

    def searchInsert(self, nums, target):

        """

        :type nums: List[int]

        :type target: int

        :rtype: int

        """

2.结果代码:

class Solution(object):def searchInsert(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] == target:return midelif nums[mid] < target:left = mid + 1else:right = mid - 1return left

说明:

  • 初始化两个指针 leftright,分别指向数组的起始和结束位置。

  • 进入循环,当 left 小于等于 right 时:

    • 计算中间索引 mid

    • 如果 nums[mid] 等于目标值 target,直接返回 mid

    • 如果 nums[mid] 小于目标值 target,说明目标值在数组的右侧,将 left 移动到 mid + 1

    • 如果 nums[mid] 大于目标值 target,说明目标值在数组的左侧,将 right 移动到 mid - 1

  • 如果循环结束后仍未找到目标值,此时 left 指针指向的位置即为目标值应该插入的位置,直接返回 left

题目2:搜索二维矩阵

1.题目要求:

题目如下:

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

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

示例 1:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -10^{4} <= matrix[i][j], target <= 10^{4}

代码框架已经提供如下:

class Solution(object):

    def searchMatrix(self, matrix, target):

        """

        :type matrix: List[List[int]]

        :type target: int

        :rtype: bool

        """

2.结果代码:

class Solution(object):def searchMatrix(self, matrix, target):""":type matrix: List[List[int]]:type target: int:rtype: bool"""if not matrix or not matrix[0]:return Falseleft, right = 0, len(matrix) * len(matrix[0]) - 1while left <= right:mid = (left + right) // 2mid_value = matrix[mid // len(matrix[0])][mid % len(matrix[0])]if mid_value == target:return Trueelif mid_value < target:left = mid + 1else:right = mid - 1return False

说明:

  • 首先判断矩阵是否为空,如果为空则直接返回 False

  • 初始化两个指针 leftright,分别指向矩阵的起始和结束位置。

  • 进入循环,当 left 小于等于 right 时:

    • 计算中间索引 mid

    • 根据 mid 计算出对应的矩阵中的行索引和列索引,得到中间值 mid_value

    • 如果 mid_value 等于目标值 target,直接返回 True

    • 如果 mid_value 小于目标值 target,说明目标值在矩阵的右侧,将 left 移动到 mid + 1

    • 如果 mid_value 大于目标值 target,说明目标值在矩阵的左侧,将 right 移动到 mid - 1

  • 如果循环结束后仍未找到目标值,返回 False

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

1.题目要求:

题目如下:

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [
5,7,7,8,8,10]
, target = 8
输出:[3,4]

示例 2:

输入:nums = [

5,7,7,8,8,10]

, target = 6
输出:[-1,-1]

示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

提示:

  • 0 <= nums.length <= 10^{5}

  • -10^{9} <= nums[i] <= 10^{9}

  • nums 是一个非递减数组

  • -10^{9} <= target <= 10^{9}

代码框架已经提供如下:

class Solution(object):

    def searchRange(self, nums, target):

        """

        :type nums: List[int]

        :type target: int

        :rtype: List[int]

        """

2.结果代码:

class Solution(object):def searchRange(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""def binary_search_left(nums, target):left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] < target:left = mid + 1else:right = mid - 1return leftdef binary_search_right(nums, target):left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] <= target:left = mid + 1else:right = mid - 1return rightleft = binary_search_left(nums, target)if left == len(nums) or nums[left] != target:return [-1, -1]right = binary_search_right(nums, target)return [left, right]

说明:

  • 定义了两个辅助函数 binary_search_leftbinary_search_right,分别用于查找目标值的左边界和右边界。

  • binary_search_left 中,当 nums[mid] < target 时,将 left 移动到 mid + 1;否则,将 right 移动到 mid - 1。最终返回 left,即目标值的左边界。

  • binary_search_right 中,当 nums[mid] <= target 时,将 left 移动到 mid + 1;否则,将 right 移动到 mid - 1。最终返回 right,即目标值的右边界。

  • 调用 binary_search_left 查找目标值的左边界,如果目标值不存在于数组中,则返回 [-1, -1]

  • 如果目标值存在于数组中,调用 binary_search_right 查找目标值的右边界,并返回 [left, right]


总结

注意以上代码还有优化空间,大家可以自己动手尝试更优算法!

针对二分查找的三种题型进行了学习,了解了部分有关二分查找与python的相关知识,大家加油!

相关文章:

  • 有人在相亲网站骗人做传销百度网址大全电脑版旧版本
  • 宁波市北仑区建设局网站企业培训考试app
  • 套用别人产品图片做网站惠州seo整站优化
  • 游戏周边产品 做网站济南seo外包服务
  • 建设网站可选择的方案有北京百度推广代运营
  • b2b网站建设公司b站新人视频怎么推广
  • DTO、VO、POJO与实体类使用方案(结合Mapper.xml)
  • HCIA-IP路由基础
  • 计算机网络-----详解HTTPS协议
  • 7.Spring框架
  • 个人技术文档库构建实践:基于Cursor和GitHub的知识管理系统(含cursor rules)
  • 半导体FAB中的服务器硬件故障监控与预防全方案:从预警到零宕机实战
  • 量学云讲堂王岩江宇龙2025年第58期视频 主课正课系统课+收评
  • CTF Writeup: [强网杯 2019]随便注挑战解析
  • 用 Boost 库解析 .ini 和 .json 文件时的“坑”:注释导致的解析错误与解决方案
  • Linux驱动学习day7
  • 【JAVA】idea中打成jar包后报错错误: 找不到或无法加载主类
  • 鸿蒙系统(HarmonyOS)经典红色风格登录页布局
  • 磁悬浮轴承刚度设计:高速转子的稳定秘诀
  • 优化 ArcPy 脚本性能
  • AI知识库搭建需要的开源技术方案
  • Azure 自动化:所需状态配置 (DSC)
  • 【iSAQB软件架构】架构模式
  • (LeetCode 面试经典 150 题) 122. 买卖股票的最佳时机 II (贪心)
  • C#高级:Winform桌面开发中DataGridView的详解(新)
  • 鸿蒙 GridRow 与 GridCol 组件解析:响应式网格布局指南