【数据结构与算法】二分查找题解(二)

在这里插入图片描述


这里写目录标题

  • 一、81. 搜索旋转排序数组 II
  • 二、167. 两数之和 II - 输入有序数组
  • 三、441. 排列硬币
  • 四、374. 猜数字大小
  • 五、367. 有效的完全平方数
  • 六、69. x 的平方根

一、81. 搜索旋转排序数组 II

中等
已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4] 。

给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums 中存在这个目标值 target ,则返回 true ,否则返回 false 。
你必须尽可能减少整个操作步骤。

示例 1:
输入:nums = [2,5,6,0,0,1,2], target = 0
输出:true

示例 2:
输入:nums = [2,5,6,0,0,1,2], target = 3
输出:false

class S81:def func(self, nums, target):left = 0right = len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] == target:return Trueelif nums[mid] > nums[right]:if nums[mid] > target and target >= nums[left]:right = mid - 1else:left = mid + 1elif nums[mid] <= nums[right]:if nums[mid] < target and target <= nums[right]:left = mid + 1else:right = mid - 1return Falser = S81()
nums = [2, 5, 6, 0, 0, 1, 2]
target = 3
print(r.func(nums, target))

二、167. 两数之和 II - 输入有序数组

中等
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。

示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

示例 2:
输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。

示例 3:
输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

def func1(nums, target):left = 0right = len(nums) - 1while left < right:if nums[left] + nums[right] == target:return [left + 1, right + 1]elif nums[left] + nums[right] > target:right -= 1else:left += 1return [-1, -1]nums = [-1, 0]
target = -1
print(func1(nums=nums, target=target))

三、441. 排列硬币

简单
你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。

给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。
在这里插入图片描述
在这里插入图片描述
解题思路
1.二分查找,设立左右边界分别为1和n,每次取中间值mid为行数,将mid行总数和n对比
3.在不断的判定后如果硬币不能刚好分完,那么left会等于能分的最多行数+1,right会等于总量超出n的最小行数-1,即为能分的最多行数,

class S441:def func(self,n):left=1right=nwhile left<=right:mid=(left+right)//2if (1+mid)*mid//2<=n:left=mid+1else:right=mid-1return rightr=S441()
n=5
print(r.func(n))

四、374. 猜数字大小

简单
猜数字游戏的规则如下:
每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。
你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):

-1:我选出的数字比你猜的数字小 pick < num
1:我选出的数字比你猜的数字大 pick > num
0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num
返回我选出的数字。

示例 1:
输入:n = 10, pick = 6
输出:6

示例 2:
输入:n = 1, pick = 1
输出:1

示例 3:
输入:n = 2, pick = 1
输出:1

示例 4:
输入:n = 2, pick = 2
输出:2

调用预定义的接口guess来得到高了还是低了的信息,数字 范围是[1,n][1,n][1,n],直到猜中题目pick的数字。
运用二分查找,从范围[1,n][1,n][1,n]开始,不断的折半,调用guessguessguess,如果midmidmid高了,就往左半折,如果低了就往右半折,直到找到了

class S374:def func(self,n):start=1end=nwhile start<=end:mid=(start+end)//2ret=guess(mid)if ret==0:return midelif ret==1:start=mid+1else:end=mid-1r=S374()
n=10
print(r.func(n))

五、367. 有效的完全平方数

简单
给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
不能使用任何内置的库函数,如 sqrt 。

示例 1:
输入:num = 16
输出:true
解释:返回 true ,因为 4 * 4 = 16 且 4 是一个整数。

示例 2:
输入:num = 14
输出:false
解释:返回 false ,因为 3.742 * 3.742 = 14 但 3.742 不是一个整数。

class S367:def func(self,num):l=1r=numwhile l<=r:mid=(l+r)//2if mid*mid==num:return Trueelif mid*mid>num:r=mid-1else:l=mid+1return False
r=S367()
num=14
print(r.func(num))

六、69. x 的平方根

简单
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:
输入:x = 4
输出:2

示例 2
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。

思路:二分查找

class S69:def func(self,x):left=0right=x     #任何数的平方根都小于本身ans=1while left<=right:mid=(left+right)//2if mid*mid==x:return midelif mid*mid<x:ans=midleft=mid+1else:right=mid-1return ansr=S69()
x=12
print(r.func(x))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/729244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux运维_Bash脚本_构建安装ReadLine-6.2.4(setup.py)

Linux运维_Bash脚本_构建安装ReadLine-6.2.4(setup.py) Bash (Bourne Again Shell) 是一个解释器&#xff0c;负责处理 Unix 系统命令行上的命令。它是由 Brian Fox 编写的免费软件&#xff0c;并于 1989 年发布的免费软件&#xff0c;作为 Sh (Bourne Shell) 的替代品。 您可…

【Linux】iftop命令详解

目录 一、iftop简介 二、安装iftop命令 2.1 命令查看测试环境系统信息 2.2 查看iftop版本与命令帮助 三、iftop的基本使用 3.1 直接使用iftop命令 3.2 iftop的显示说明 3.3 指定监控某块网卡 3.4 显示某个网段进出封包流量 3.5 按照流量排序 3.6 过滤显示连接 3.7 …

米酒生产加工污水处理需要哪些工艺设备

米酒生产加工过程中产生的污水是一项重要的环境问题&#xff0c;需要采用适当的工艺设备进行处理。下面将介绍一些常用的污水处理工艺设备。 首先&#xff0c;生产过程中的污水需要进行初级处理&#xff0c;常见的设备包括格栅和砂池。格栅用于去除污水中的大颗粒杂质&#xff…

穿越程序员的迷宫:前端花园、后端洞穴与数据科学的密室

穿越程序员的迷宫&#xff1a;前端花园、后端洞穴与数据科学的密室 当你步入程序员的职业赛道&#xff0c;就像踏入一座错综复杂的迷宫。这座迷宫中&#xff0c;有前端的美丽花园&#xff0c;后端的黑暗洞穴&#xff0c;还有数据科学的神秘密室。每一个转角都可能藏着新的机遇…

金相显微镜(金相镜)主要用于材料金相分析 我国市场集中度较低

金相显微镜&#xff08;金相镜&#xff09;主要用于材料金相分析 我国市场集中度较低 金相显微镜又称为金相镜&#xff0c;是指通过光学放大&#xff0c;对材料显微组织、低倍组织和断口组织等进行分析研究和表征的光学显微镜。金相显微镜通常由目镜、物镜、照明系统、旋转台等…

Unity 和 UE 的 .gitignore 文件

各种.gitignore版本 点击跳转 Unity .gitignore 模版 # This .gitignore file should be placed at the root of your Unity project directory # # Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore # /[Ll]ibrary/ /[Tt]emp/ /[Oo]bj/ /[Bb…

视频监控平台EasyCVR+4G/5G应急布控球远程视频监控方案

随着科技的不断发展&#xff0c;应急布控球远程视频监控方案在公共安全、交通管理、城市管理等领域的应用越来越广泛。这种方案通过在现场部署应急布控球&#xff0c;实现对特定区域的实时监控&#xff0c;有助于及时发现问题、快速响应&#xff0c;提高管理效率。 智慧安防视…

idea步过,步入,步出,详解

在软件开发中&#xff0c;"Idea"通常指的是JetBrains公司开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于编写、调试和运行各种编程语言的应用程序。下面是对"Idea"中的步过、步入和步出的详细解释&#xff1a; 步过&#xff08;Step …

MySQL如何使用EXPLAIN优化SQL:输出内容参考手册

MySQL如何使用EXPLAIN优化SQL&#xff1a;输出内容参考手册 这篇文章差不多是MySQL官网的翻译版本&#xff0c;有任何不清楚的&#xff0c;或者翻译不到位的地方&#xff0c;都可以直接去官网查询原文档。 MySQL 8.0 Reference Manual - EXPLAIN Output Format EXPLAIN语句提…

为什么不推荐使用外键

定义外键之后&#xff0c;数据库的每次操作都需要去检查外键约束。对于插入来说&#xff0c;影响了插入速度&#xff1b;对于更新来说&#xff0c;级联更新是强阻塞&#xff0c;存在数据库更新风暴&#xff08;Database Update Storm&#xff09;的风险。 所谓 Database Updat…

2024健康服务展/营养健康展/山东功能性食品展会/大健康展

6大展馆&#xff0c;1200家参展商&#xff0c;20000款展品&#xff0c;100000买家&#xff0c;打造2024年度大健康行业价值盛会&#xff1b; 2024第6届中国&#xff08;济南&#xff09;国际大健康产业博览会&#xff08;China-DJK山东健博会&#xff09; The 2024 sixth Chin…

window vscode安装node.js

window vscode安装node.js 官网下好vscode 和nodejs 点这个安装 等待安装完毕 在VScode运行 npm -v node -v 显示版本号则成功

【剑指offer】70--矩形覆盖[C++]

目录 1. 题目描述 2. 解题思路 3.【C解法】 4. 输出结果 1. 题目描述 我们可以用 2*1 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形&#xff0c;总共有多少种方法&#xff1f;注意&#xff1a;约定 n 0 时&#xff0c;输…

StarCoder 2:GitHub Copilot本地开源LLM替代方案

GitHub CoPilot拥有超过130万付费用户&#xff0c;部署在5万多个组织中&#xff0c;是世界上部署最广泛的人工智能开发工具。使用LLM进行编程辅助工作不仅提高了生产力&#xff0c;而且正在永久性地改变数字原住民开发软件的方式&#xff0c;我也是它的付费用户之一。 低代码/…

JVM-对象创建与内存分配机制深度剖析 3

JVM对象创建过程详解 类加载检查 虚拟机遇到一条new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个 符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;那必须先执行相应的类加载过程。 new…

【小黑送书—第十一期】>>如何阅读“计算机界三大神书”之一 ——SICP(文末送书)

《计算机程序的构造和解释》&#xff08;Structure and Interpretation of Computer Programs&#xff0c;简记为SICP&#xff09;是MIT的基础课教材&#xff0c;出版后引起计算机教育界的广泛关注&#xff0c;对推动全世界大学计算机科学技术教育的发展和成熟产生了很大影响。…

园区内网配置——华为

部署思路 表1 设备登录安全策略部署 部署建议 功能描述 应用场景 配置本地Console口登录的安全功能 配置Console口用户界面的认证方式和用户级别等。 本地Console口登录设备时建议配置此功能&#xff0c;提升本地设备登录的安全性。 配置远程STelnet登录的安全功能 配置…

2024年AI辅助研发:科技新贵,工业变革的先锋

2024年AI辅助研发&#xff1a;科技新贵&#xff0c;工业变革的先锋 随着人工智能&#xff08;AI&#xff09;技术的持续发展与突破&#xff0c;我们站在了一个令人振奋的时代门槛上。2024年&#xff0c;AI辅助研发正迅速成为科技界和工业界共同瞩目的焦点。从实验室的微观世界…

nginx 的 location 模块

目录 一、匹配规则 1.基础匹配 2.精确匹配 3.前缀匹配 4.正则表达式匹配 二、优先级顺序 三、示例 1.精确匹配 2.前缀匹配 3.正则匹配 4.默认匹配 第一种情况&#xff1a;proxy_pass最后面没有斜杠,匹配路径有斜杠(/bbb/) 第二种情况&#xff1a; proxy_pass最后面…

日常开发Git命令

场景&#xff1a; 在远程库创建分支后&#xff0c;在本地开发后-合并代码-push到远程库 命令行 #查看现在分支 git branch #切换到master分支 git checkout master #拉取远程库修改 git pull git branch #切换到修改的分支 git checkout feature/s3-use-internel-name #merg…