当前位置: 首页 > 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的相关知识,大家加油!

http://www.lqws.cn/news/520579.html

相关文章:

  • 2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(二)
  • 掌握CIS基准合规性:通过自动化简化网络安全
  • 【Lua 基础学习】
  • P2840 纸币问题 2(动态规划)
  • 7.Spring框架
  • “Ubuntu 18.04.6 LTS“ 配置网卡静态IP
  • BGP边界网关协议
  • 【视频芯片选型】
  • Bugku-CTF-web(适合初学者)
  • 50. Pow(x, n)快速幂算法
  • 使用 WSL 启动ubuntu.tar文件
  • ubuntu中53端口被占用导致dnsmasq无法使用。已解决。
  • 51c嵌入式~PCB~合集1
  • 《从0到1:C/C++音视频开发自学完全指南》
  • vue3用js+css实现轮播图(可调整堆叠程度)
  • UI前端大数据处理技巧:如何高效处理海量异构数据?
  • DDNS-GO 使用教程:快速搭建属于自己的动态域名解析服务(Windows 版)
  • 如何在 Manjaro Linux 的图像界面上安装 Stremio 而不是使用命令行
  • 3 大语言模型预训练数据-3.2 数据处理-3.2.3 隐私消除——使用正则表示方法过滤个人隐私信息数据(包括邮件、电话、地址等)
  • 快速排序算法
  • 使用 Netty 实现 TCP 私有协议(解决粘包/拆包)
  • Python-文件管理
  • 领域驱动设计中的编程风格选择:面向对象与过程式的平衡艺术
  • 数学:向量的点积是什么?怎么计算?
  • 【EI会议征稿】东北大学主办第三届机器视觉、图像处理与影像技术国际会议(MVIPIT 2025)
  • 服务器开放端口如何设置,本地内网开通应用端口让外网访问连接步骤
  • OpenHarmony构建脚本build.sh解析
  • 【MongoDB】MongoDB从零开始详细教程 核心概念与原理 环境搭建 基础操作
  • 使用EasyExcel处理动态表头数据导入
  • AWS WebRTC:通过shell实现多进程启动viewer