Golang 二分查找 LEETCODE704 小记

二分查找 leetcode704

前面部分第4题,包括使用条件等感谢代码随想录:)
leetcode704

  二分查找用于在有序不重复的元素列表中寻找需要的元素,返回其位置或错误

  当要求算法的时间复杂度在O(logn) 等带log的复杂度时,可以考虑二分查找法

  二分查找法中对于 区间 的定义

  二分查找涉及的很多的边界条件,逻辑比较简单,但就是写不好。例如到底是 while(left < right) 还是 while(left <= right),到底是right = middle呢,还是要right = middle - 1呢?

  对于二分法的区间定义,可以有闭区间、左闭右开、左开右闭等多种写法,他们的含义是我们寻找的target与左右指针的关系
与此相关的自然就会产生循环条件的判断 以及 每次循环的左右指针的偏移 的定义问题
以下为闭区间版本的写法:

// 学习版本二分查找
func search(nums []int, target int) int {high := len(nums) - 1low := 0for low <= high { //在闭区间中如[1,1]是有意义的mid := low + (high-low)/2 //这样定义防止数字太大溢出if nums[mid] == target {return mid} else if nums[mid] > target { //缩小target所在的区间,由于为闭区间,可以舍弃上次的边界值high = mid - 1} else {low = mid + 1}}return -1
}

左闭右开区间版本:

// 左闭右开区间版本
func search(nums []int, target int) int {high := len(nums) //由于右开,取不到最右边的数,所以这里不用-1也不会超限low := 0for low < high { //类似于[1,1)这样的区间是没有意义的mid := low + (high-low)/2 //同样防止溢出if nums[mid] == target {return mid} else if nums[mid] > target {high = mid //右开,不需要舍弃右边值} else {low = mid + 1 //左开,当前值不符合,抛弃当前值}}return -1
}

704 学习 完整代码如下:

package mainimport ("fmt"
)func main() {nums := []int{-1, 0, 3, 5, 9, 12}n := search(nums, 8)fmt.Println(n)
}//赖子玩法,使用hashmap进行解决
/*func search(nums []int, target int) int {Abook := map[int]int{}for i, num := range nums {Abook[num] = i}number, ok := Abook[target]if ok {return number}return -1
}
*/// 使用二分查找进行查询 个人版本,对区间的定义理解不够
// 因此需要额外定义多种情况
/*func search(nums []int, target int) int {left, right := 0, len(nums)-1//如果该目标值直接大于或者小于nums中所有数,直接返回-1if target > nums[right] || target < nums[left] {return -1}//为了避免与后面查询不到的情况避开,我们这里直接设定两个值时的情况if nums[0] == target {return 0}if nums[right] == target {return right}for {mid := (left + right) / 2 //偶数为中间往前一个数 ; 奇数即为中间数//如果寻找到目标值。返回if nums[mid] == target {return mid}//如果没有查询到目标值if math.Abs(float64(left-right)) == 1 {return -1}if nums[mid] < target { //目标大于中间值,往后查找left = mid} else { //nums[mid] > target//目标小于中间值,往前查询right = mid}}}*/// 学习版本二分查找 闭区间
/*func search(nums []int, target int) int {high := len(nums) - 1low := 0for low <= high { //在闭区间中如[1,1]是有意义的mid := low + (high-low)/2 //这样定义防止数字太大溢出if nums[mid] == target {return mid} else if nums[mid] > target { //缩小target所在的区间,由于为闭区间,可以舍弃上次的边界值high = mid - 1} else {low = mid + 1}}return -1
}*/// 左闭右开区间版本
func search(nums []int, target int) int {high := len(nums) //由于右开,取不到最右边的数,所以这里不用-1也不会超限low := 0for low < high { //类似于[1,1)这样的区间是没有意义的mid := low + (high-low)/2 //同样防止溢出if nums[mid] == target {return mid} else if nums[mid] > target {high = mid //右开,不需要舍弃右边值} else {low = mid + 1 //左开,当前值不符合,抛弃当前值}}return -1
}

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

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

相关文章

C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数

目录 一、编写程序&#xff0c;输入三个字符串&#xff0c;比较它们的大小&#xff0c;并将它们按由小到大的顺序输出。要求用函数、指针实现。要求:要采用函数调用&#xff0c;并用指向函数的指针作为函数的参数。 1.不使用函数指针作为参数&#xff0c;并自己模拟strcmp。 …

Flume 安装与部署

目录 Flume 下载地址 &#xff08;1&#xff09;将 apache-flume-1.9.0-bin.tar.gz 上传到 linux 的 /opt/software 目录下 &#xff08;2&#xff09;解压 apache-flume-1.9.0-bin.tar.gz 到 /opt/module/ 目录下 huweihadoop101 ~]$ tar -zxvf /opt/software/apache-flume-…

001 Windows虚拟机

一、虚拟机安装Windows10 选自定义安装 升级是针对你电脑上有系统的情况下&#xff0c;你要升级&#xff1b;没有系统就选择自定义。 硬盘60G 直接单击下一步就是一个盘 如果你想对磁盘进行分区 分第一个区的时候它会去创建系统的保留分区和系统分区&#xff0c;然后还剩20…

acwing算法提高之动态规划--状态压缩DP

目录 1 基础知识2 模板3 工程化 1 基础知识 暂无。。。 2 模板 暂无。。。 3 工程化 题目1&#xff1a;小国王。 解题思路&#xff1a;状态压缩DP。 状态定义f[i][j][a]&#xff1a;表示已经考虑了前i行&#xff0c;并且摆放了j个国王&#xff0c;且第i行的状态是a的总方…

qt程序在Linux下打包的一般流程

编译 手动编写编译脚本 qmake make复制依赖库 参考文章&#xff1a; https://blog.csdn.net/JOBbaba/article/details/124289626 https://zhuanlan.zhihu.com/p/49919048 复制系统依赖库 编写复制脚本copy.sh ldd复制Qt依赖库 主要是libqxcb.so的相关依赖需要复制&…

流量分析基础

定义&#xff1a; 流量分析&#xff08;Traffic Analysis&#xff09;是指对网络流量数据进行分析和解释&#xff0c;以获得有关网络中通信的信息和情报。这种技术可以用于网络安全、网络管理和网络优化等领域。 网络流量包含了许多有关网络通信的细节信息&#xff0c;如源IP地…

Linux c++开发-06-使用Linux API 进行文件的读写

先简单的介绍一下open,read,write 先用open接口去打开文件&#xff0c;flag表示打开文件的权限不同。 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);示例 结果&#xff1a;

AD9361 Evaluation Software配置脚本转换工具

最近在玩一个开源的AD9361项目&#xff0c;AD9361采用纯逻辑配置&#xff0c;不需要ARM或者MicroBlaze。其中&#xff0c;先是用AD9361 Evaluation Software生成配置脚本&#xff0c;再转换成ad9361_lut.v。 在网上查了一圈&#xff0c;有个转换工具叫bit_converter&#xff0…

经典深度学习算法【1】:K-近邻算法(KNN)概述

最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来&#xff0c;当测试对象的属性和某个训练对象的属性完全匹配时&#xff0c;便可以对其进行分类。但是怎么可能所有测试对象都会找到与之完全匹配的训练对象呢&#xff0c;其次就是存在一个测试对象同时与多个训练…

跟我学c++高级篇——C++26反射预览

一、c23的反射跳票 本来按照预定&#xff0c;c23中反射就应该比较全的。结果&#xff0c;由于众所周知的原因&#xff0c;线上会议肯定是不如线下会议效率高&#xff0c;那么反射这种对于c不太急切的功能&#xff08;当然&#xff0c;也有其它原因&#xff09;只能向后放一放。…

迭代器的分类

迭代器的分类&#xff1a; 这里的前置后置递增是a和a&#xff1b; 这里的前值后置递减是a--和--a&#xff1b; 各迭代器的继承关系&#xff1a; 当使用双向迭代器时&#xff0c;可以使用随机迭代器&#xff1b;

THEMIS---Beta Sprint Summary Essay Blog

Which course does this assignment belong to2301-MUSE社区-CSDN社区云What are the requirements for this assignmentbeta SprintThe goal of this assignmentTo summarize the beta task progress and the teams sprintsTeam NameThemisTop-of-the-line collection of essa…

架构师和软件架构

架构师和软件架构 引言 在今天的数字化世界中&#xff0c;软件已成为我们生活和工作的不可或缺的一部分。从简单的应用程序到复杂的系统&#xff0c;软件的设计和开发过程都需要精心的规划和管理。这里&#xff0c;软件架构的概念和软件架构师的角色就显得尤为重要。 软件架…

maui中实现加载更多 RefreshView跟ListView 跳转到详情页 传参(3)

效果如图 这里的很多数据是通过传参过来的的。 代码 例表页加入跳转功能&#xff1a; <ListView ItemsSource"{Binding Items}" ItemAppearing"OnItemAppearing" ItemTapped"OnItemTapped" RowHeight"70" Margin"20"…

visual studio 2019 移除/卸载项目已经如何再加载项目

文章目录 移除解决方案下的某个项目添加已移除的项目移除项目加载已卸载的项目注意事项 移除解决方案下的某个项目 在项目名称上&#xff0c;点击鼠标右键&#xff0c;弹出右键工具栏&#xff0c;找到 移除 功能。 然后鼠标左键点击 移除。 弹出的模态框&#xff0c;选择确定…

代码随想录刷题题Day15

刷题的第十五天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day15 任务 ● 513.找树左下角的值 ● 112. 路径总和 113.路径总和ii ● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历…

MYSQL备份和恢复

数据库的备份和恢复&#xff1a; 备份&#xff1a;完全备份 增量备份 完全备份&#xff1a;将整个数据库完整的进行备份 增量备份&#xff1a;在完全备份的基础之上&#xff0c;对后续新增的内容进行备份 备份的需求&#xff1a; 在生产环境中&#xff0c;数据的安全至关重…

Docker安装Redis哨兵

目录 Redis哨兵 一、哨兵模式的主要概念和组件 二、哨兵模式的工作流程 三、哨兵配置流程 1、创建Redis哨兵配置文件 2、启动哨兵 3、命令解读 4、 查看哨兵是否正常启动 5、测试主机宕机 四、哨兵运行流程 五、哨兵选举算法 六、哨兵使用建议 Redis哨兵 Redis哨兵…

josef约瑟 时间继电器 DS-23/C AC220V 10S柜内板前接线

系列型号&#xff1a; DS-21时间继电器 &#xff1b;DS-22时间继电器&#xff1b; DS-23时间继电器&#xff1b;DS-24时间继电器&#xff1b; DS-21C时间继电器&#xff1b;DS-22C时间继电器&#xff1b; DS-23C时间继电器&#xff1b; DS-25时间继电器&#xff1b;DS-26…

python/c++ Leetcode题解——746. 使用最小花费爬楼梯

目录 方法一&#xff1a;动态规划 复杂度分析 方法一&#xff1a;动态规划 假设数组 cost 的长度为 n&#xff0c;则 n 个阶梯分别对应下标 0 到 n−1&#xff0c;楼层顶部对应下标 n&#xff0c;问题等价于计算达到下标 n 的最小花费。可以通过动态规划求解。 创建长度为 n…