数组-二分查找

2023-05-16

1 Search a 2D Matrix

1.1 题目描述

# You are given an m x n integer matrix matrix with the following two 
# properties: 
# 
#  
#  Each row is sorted in non-decreasing order. 
#  The first integer of each row is greater than the last integer of the 
# previous row. 
#  
# 
#  Given an integer target, return true if target is in matrix or false 
# otherwise. 
# 
#  You must write a solution in O(log(m * n)) time complexity. 
# 
#  
#  Example 1: 
# 
#  
# Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
# Output: true
#  
# 
#  Example 2: 
# 
#  
# Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
# Output: false
#  
# 
#  
#  Constraints: 
# 
#  
#  m == matrix.length 
#  n == matrix[i].length 
#  1 <= m, n <= 100 
#  -10⁴ <= matrix[i][j], target <= 10⁴ 
#  
#  Related Topics 数组 二分查找 矩阵 👍 795 👎 0
from typing import List


# leetcode submit region begin(Prohibit modification and deletion)
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        left = 0
        right = len(matrix) - 1
        mid = 0
        while left <= right:
            mid = left + (right - left) // 2
            if matrix[mid][-1] < target:
                left = mid + 1
            elif matrix[mid][0] > target:
                right = mid - 1
            else:
                break
        row_left = 0
        row_right = len(matrix[0]) - 1
        while row_left <= row_right:
            row_mid = row_left + (row_right - row_left) // 2
            if matrix[mid][row_mid] == target:
                return True
            elif matrix[mid][row_mid] > target:
                row_right = row_mid - 1
            else:
                row_left = row_mid + 1
        return False


# leetcode submit region end(Prohibit modification and deletion)


if __name__ == '__main__':
    so = Solution()
    matrix = [[1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 60]]
    target = 3
    res = so.searchMatrix(matrix, target)
    print(res)

1.2 解题思路

  • 注意left <= right中的=情况,如果遗漏,left=right的情况的无法比较。
  • 边界调整时,边界的条件你能够使得mid + 1或者mid - 1,如果直接使用mid会出现死循环的情况。
  • 右边界的初始选取情况一般为数组长度-1

2 Search in a Ratated Sorted Array II

2.1 题目描述

题目:leetcode 81

# There is an integer array nums sorted in non-decreasing order (not 
# necessarily with distinct values). 
# 
#  Before being passed to your function, nums is rotated at an unknown pivot 
# index k (0 <= k < nums.length) such that the resulting array is [nums[k], nums[k+1]
# , ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] (0-indexed). For example, [0
# ,1,2,4,4,4,5,6,6,7] might be rotated at pivot index 5 and become [4,5,6,6,7,0,1,
# 2,4,4]. 
# 
#  Given the array nums after the rotation and an integer target, return true 
# if target is in nums, or false if it is not in nums. 
# 
#  You must decrease the overall operation steps as much as possible. 
# 
#  
#  Example 1: 
#  Input: nums = [2,5,6,0,0,1,2], target = 0
# Output: true
#  Example 2: 
#  Input: nums = [2,5,6,0,0,1,2], target = 3
# Output: false
#  
#  
#  Constraints: 
# 
#  
#  1 <= nums.length <= 5000 
#  -10⁴ <= nums[i] <= 10⁴ 
#  nums is guaranteed to be rotated at some pivot. 
#  -10⁴ <= target <= 10⁴ 
#  
# 
#  
#  Follow up: This problem is similar to Search in Rotated Sorted Array, but 
# nums may contain duplicates. Would this affect the runtime complexity? How and why?
#  
from typing import List


# leetcode submit region begin(Prohibit modification and deletion)
class Solution:
    def search(self, nums: List[int], target: int) -> bool:
        left = 0
        right = len(nums) - 1
        while left <= right:
            mid = left + (right - left) // 2
            if nums[mid] == target:
                return True
            else:
                if nums[mid] > nums[right]:
                    if nums[left] <= target < nums[mid]:
                        right = mid - 1
                    else:
                        left = mid + 1
                elif nums[mid] < nums[right]:
                    if nums[mid] < target <= nums[right]:
                        left = mid + 1
                    else:
                        right = mid - 1
                else:
                    j = left
                    while j < right:
                        if nums[j] == target:
                            return True
                        j += 1
                    right = mid - 1
        return False


# leetcode submit region end(Prohibit modification and deletion)

if __name__ == '__main__':
    so = Solution()
    nums = [1, 3]
    # [3,4,5,6,7,1,2],[7,6,1,2,3,4,5],[7,6,5,4,3,2,1]
    target = 3
    res = so.search(nums, target)
    print(res)

2.2 解题思路

  • 数组主要分为这两种[3,4,5,6,7,1,2]和[7,6,1,2,3,4,5]这两种类型。
  • 根据mid去判断哪一部分有序,然后从有序那一部分去判断。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数组-二分查找 的相关文章

  • 二分查找,你真的掌握了吗?

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 8937978 二分查找 xff0c 最基本的算法之一 xff0c
  • 数据结构实验之查找四:二分查找

    数据结构实验之查找四 xff1a 二分查找 Time Limit 30 ms Memory Limit 65536 KiB Submit Statistic Discuss Problem Description 在一个给定的无重复元素的递
  • 数组-二分查找

    1 Search a 2D Matrix 1 1 题目描述 span class token comment You are given an m x n integer matrix matrix with the following t
  • 二分查找BinarySearch原理分析、判定树、及其变种

    二分查找BinarySearch 1 二分查找及其要求 二分查找 又叫折半查找 是一种效率较高的查找算法 1 二分查找的要求 线性表是有序表 即表中结点按关键字有序 并且要用向量作为表的存储结构 不妨设有序表是递增有序的 存储结构 二分查找
  • 【牛客面试必刷TOP101】Day4.BM15删除有序链表中重复的元素-I和BM17二分查找-I

    作者简介 大家好 我是未央 博客首页 未央 303 系列专栏 牛客面试必刷TOP101 每日一句 人的一生 可以有所作为的时机只有一次 那就是现在 文章目录 前言 一 删除有序链表中重复的元素 I 题目描述 解题分析 二 二分查找 I 题目
  • C++:采用vector实现二分查找及其变种总结

    主要分为六种情况 闭区间 半开区间 中位值在循环之外的半开区间二分查找首个序列 中位值在循环之外的半开区间二分查找末尾序列 以及中位值在循环之外的完全开区间二分查找首个序列和中位值在循环之外的完全开区间二分查找末尾序列 include
  • 《数据结构与算法》实验:查找结构的实验比较——二叉查找树BST & 二分(折半)查找

    数据结构与算法 实验和课程Github资源 数据结构与算法 实验 线性结构及其应用 算术表达式求值 数据结构与算法 实验 树型结构的建立与遍历 数据结构与算法 实验 图结构的建立与搜索 数据结构与算法 实验 查找结构的实验比较 二叉查找树B
  • 二分查找法(折半查找法)及C语言实现

    折半查找 也称二分查找 在某些情况下相比于顺序查找 使用折半查找算法的效率更高 但是该算法的使用的前提是静态查找表中的数据必须是有序的 例如 在 5 21 13 19 37 75 56 64 88 80 92 这个查找表使用折半查找算法查找
  • Leetcode 2861. Maximum Number of Alloys

    Leetcode 2861 Maximum Number of Alloys 1 解题思路 2 代码实现 题目链接 2861 Maximum Number of Alloys 1 解题思路 这一题思路上还是挺清晰的 就是对每一台机子看一下其
  • Day01.二分查找、移除元素

    Day01 二分查找 移除元素 0704 二分查找 题目链接 0704 二分查找 思路 二分查找 仅对有序数组有效 每次需要数组的中间值 与目标值比较大小 如果中间值比目标值大 说明目标值位置在left与mid中间 区间缩小一半 同理 如果
  • JavaScript实现 -- 二分搜索

    二分搜索 二分搜索 binary search 也称折半搜索 对数搜索 是一种在有序数组中查找某一特定元素的搜索算法 原理 二分搜索算法的原理和猜数字游戏类似 就是有人让你从1 100之间选一个数字让他猜 他告诉你猜测的数字 你回复他猜测的
  • ?101 Redraiment的走法【梅花桩】【最长上升子序列】

    题目描述 题目描述 Redraiment是走梅花桩的高手 Redraiment总是起点不限 从前到后 往高的桩子走 但走的步数最多 不知道为什么 你能替Redraiment研究他最多走的步数吗 样例输入 6 2 5 1 5 4 5 样例输出
  • 寻找重复数

    lettCode 287 寻找重复数 给定一个包含 n 1 个整数的数组 nums 其数字都在 1 到 n 之间 包括 1 和 n 可知至少存在一个重复的整数 假设只有一个重复的整数 找出这个重复的数 示例 1 输入 1 3 4 2 2 输
  • kafka日志分段(.log文件)及日志文件索引机制(偏移量索引、时间戳索引)

    Kafka版本 2 2 1 环境 CDH 日志分段 segment 格式 在kafka数据存储的目录下 进入topic文件目录 可以看到多个文件 如下 从文件名可以看出 log index timeindex文件一一对应 rw r r 1
  • 牛客面试必刷TOP101——二分查找排序

    列表 二分查找 I BM17 二维数组中的查找 BM18 寻找峰值 BM19 组中的逆序对 BM20 旋转数组的最小数字 BM21 比较版本号 BM22 二分查找 I BM17 原题 请实现无重复数字的升序数组的二分查找 给定一个 元素升序
  • 二分查找(Binary Search) 常见问题解决方法总结

    缘由 今天浏览 何登成的技术博客 无意中发现了写的blog 二分查找 Binary Search 需要注意的问题 以及在数据库内核中的实现 随想总结下二分查找的常见问题 问题背景 今年的实习生招聘考试 我出了一道二分查找 Binary Se
  • java实现二分查找-两种方式

    二分查找是一种查询效率非常高的查找算法 又称折半查找 起初在数据结构中学习递归时实现二分查找 实际上不用递归也可以实现 毕竟递归是需要开辟额外的空间的来辅助查询 本文就介绍两种方法 二分查找算法思想 有序的序列 每次都是以序列的中间位置的数
  • 无序(未排序)数组二分查找

    二分查找也称折半查找 Binary Search 它是一种效率较高的查找方法 但是 折半查找要求线性表必须采用顺序存储结构 而且表中元素按关键字有序排列 但是对于无序数组 我们可以先排序在二分 但还有一种技巧就是结合快排的思想 即每次选择一
  • python之折半查找算法

    折半查找算法也叫二分查找算法 算法的细节我就不讲了 但是必须说一下二分查找是基于我们之前的数据是有序的 如果没有序该算法是没有意义的 个人觉得代码比较直观 所以我这里就直接上代码了 折半查找非递归算法 折半查找非递归算法 折半查找函数 参数
  • 【LeetCode:162. 寻找峰值 | 二分】

    算法题 算法刷题专栏 面试必备算法 面试高频算法 越难的东西 越要努力坚持 因为它具有很高的价值 算法就是这样 作者简介 硕风和炜 CSDN Java领域新星创作者 保研 国家奖学金 高中学习JAVA 大学完善JAVA开发技术栈 面试刷题

随机推荐

  • keil5仿真相关配置,解决相关bug

    一 keil5仿真时 xff0c 添加动态数值至观察窗口 xff08 watch X xff09 xff0c 但是值不变化或提示错误 原因分析 xff1a 1 1 未将观察的变量配置为全局变量 xff0c 需要将观察的变量配置为全局变量 x
  • 查看vs支持的c#语言版本/查看.NetCore版本/更改c#语言版本

    1 查看vs支持的c 版本 注意语言版本控制 官网解释 Windows 10 选择 开始 键盘上的 Windows 徽标键 并滚动到字母 V 展开 Visual Studio 2019 文件夹 选择 VS 2019 开发人员命令提示 xff
  • Yum项目上线实战(网站运维)

    项目上线 一 编译安装与卸载Nginx二 关于LAMP三 LAMP环境部署 一 编译安装与卸载Nginx Nginx xff1a 是一款比较流行的web服务器软件 xff0c 类似于Apache 1 安装nginx 下载nginx ngin
  • elment ui 全部报错,参数不能赋给类型“App<any> ,怀疑是插件更新的原因

    elment组件全部报错 xff0c 的参数不能赋给类型 App lt any gt amp xff0c 有一样的情况的吗 xff0c 目前怀疑是插件更新的原因
  • mybatis-plus-boot-starter 引用不了包BaseMapper

    我的解决办法是 xff1a 调整版本号到3 2 0 lt dependency gt lt groupId gt com baomidou lt groupId gt lt artifactId gt mybatis plus boot s
  • Unrecognized option: --Xmx5120m

    Container exited with a non zero exit code 1 Error file prelaunch err Last 4096 bytes of prelaunch err Last 4096 bytes o
  • 廖雪峰Python教程之mapreduce

    1 map 函数 map 函数接收两个参数 xff0c 一个是函数 xff0c 一个是Iterable xff0c map将传入的函数依次作用到序列的每个元素 xff0c 并把结果作为新的Iterator返回 def f x return
  • 正则基础知识

    正则 RegExp xff1a 由相关元字符和修饰符组成的一个规则 xff0c 匹配 验证和捕获 xff08 只用来处理字符串 xff09 可以理解为两个斜杠中间包含一些内容就是正则 元字符 xff1a 元字符 两个斜杠之间包起来的内容 正
  • The packaging for this project did not assign a file to the build artifact 问题解决

    1 问题出现场景 新建一个Java工程 xff0c 添加testng依赖文件 xff0c 准备使用mvn install安装testng工具时 xff0c 点击如下图1 xff0c 发生以下报错信息图2 xff0c The packagin
  • vscode连接服务器免密码登录

    在windows环境下 xff0c 有时候需要用到linux平台开发 xff0c 如果用Ubuntu虚拟机的话 xff0c 用起来很不习惯 xff0c 不方便切换到windows界面 xff0c 可以把代码放到服务器上 xff0c 用vs
  • kubectl安装无法连接packages.cloud.google.com

    1 问题描述 Err 4 https packages cloud google com apt kubernetes xenial InRelease Could not connect to packages cloud google
  • Centos8-stream安装PostgreSQL13

    一 安装postgresql13 server yum span class token function install span y https download postgresql org pub repos yum reporpm
  • ttf文件结构解析

    TrueType字体通常包含在单个TrueType字体文件中 xff0c 其文件后缀为 TTF OpenType字体是以类似 于TrueType字体的格式编码的POSTSCRIPT字体 OPENTYPE字体使用 OTF文件后缀 OPENTY
  • centos卸载软件三种方式

    1 我们来卸载用yum安装的软件 xff1a yum remove 软件名字 xff1b 2 如果是用rpm包安装的软件呢 xff0c 则使用如图命令进行卸载 xff1b rpm e 软件名 xff1b 3 如果是用tar包安装的软件呢 x
  • Pycharm设置http代理

    1 Pycharm设置 2 urllib下载数据配置 span class token keyword from span urllib span class token punctuation span error span class
  • Docker 配置网络代理

    有时因为网络原因 xff0c 比如公司 NAT xff0c 或其它啥的 xff0c 需要使用代理 Docker 的代理配置 xff0c 略显复杂 xff0c 因为有三种场景 但基本原理都是一致的 xff0c 都是利用 Linux 的 htt
  • 安装 OpenVPN 客户端

    安装 OpenVPN 客户端 yum y span class token function install span epel release yum y span class token function install span op
  • 字符串-字符串匹配

    Leetcode 28题 1 题目描述 Given two strings needle and haystack return the index of the first occurrence of needle in haystack
  • pip无法安装包到新创建的虚拟环境下面,安装包冲突

    第1步 xff1a 查看安装包的路径 span class token punctuation span label studio span class token punctuation span user 64 master pytho
  • 数组-二分查找

    1 Search a 2D Matrix 1 1 题目描述 span class token comment You are given an m x n integer matrix matrix with the following t