二分查找向下取整导致的死循环69. x 的平方根

2024-05-10 03:28

本文主要是介绍二分查找向下取整导致的死循环69. x 的平方根,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二分查找向下取整导致的死循环

        考虑伪题目:从数组arr中查找出目标元素target对应的下标,如果数组中不存在目标元素,找

到第一个元素值小于target的元素的下标。

        编写二分查找算法如下:

    @Testvoid testBinarySearch(){int[] arr = new int[]{1, 2};int left = 0, right = arr.length - 1, target = 2;while(left < right){int mid = left + (right - left) / 2;if(arr[mid] == target){System.out.println("Find target index is :" + mid);}else if(arr[mid] > target){right = mid + 1;}else if(arr[mid] < target){left = mid;}System.out.println("Program is running...");}}

        通过代码执行结果可以得出此二分查找陷入死循环:

        分析以上二分查找代码逻辑,题目意思可以理解为寻找第一个小于或者等于target目标元素的下标。当只有两个元素的时候,此时情况[left, right]由于Java是向下取值,此时right和left仅仅相隔一个元素,计算mid相当于(left + left + 1)/ 2等于left,mid对应left位置,由于arr[mid] < target,所以left取值为mid,也就是[left,right]的相对位置保持不变,所以陷入死循环。

        解决方案,将向下取整变为向上取整,完美解决,修改后代码如下:

在二分查找中【只有两个元素时】出现死循环,如下:

[left,right]==>取值策略:left = mid,right = mid - 1,此时只有进入right循环时才会改变left、right的相对位置,否则进入left = mid死循环。

解决方案:将mid计算方案中向下取整改为向上取值,此时只有两个元素的时候永远计算的是较大者。【要针对具体情况讨论

 69. x 的平方根 

        题目链接:69. x 的平方根 - 力扣(LeetCode)

        上面的问题的引入以及解答均是自己在做lc题目69的时候看到的题解中某句话的理解。

 参考链接

69. x 的平方根 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/sqrtx/solutions/7866/er-fen-cha-zhao-niu-dun-fa-python-dai-ma-by-liweiw/?envType=study-plan-v2&envId=top-interview-150

这篇关于二分查找向下取整导致的死循环69. x 的平方根的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975306

相关文章

随想录 Day 69 并查集 107. 寻找存在的路径

随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好vector<int> father = vector<int> (n, 0); // C++里的一种数组结构// 并查集初始化void init() {for (int i = 0; i < n; ++i) {father[i] = i;}

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

问题-windows-VPN不正确关闭导致网页打不开

为什么会发生这类事情呢? 主要原因是关机之前vpn没有关掉导致的。 至于为什么没关掉vpn会导致网页打不开,我猜测是因为vpn建立的链接没被更改。 正确关掉vpn的时候,会把ip链接断掉,如果你不正确关掉,ip链接没有断掉,此时你vpn又是没启动的,没有域名解析,所以就打不开网站。 你可以在打不开网页的时候,把vpn打开,你会发现网络又可以登录了。 方法一 注意:方法一虽然方便,但是可能会有

导航条下 ScrollView 第一个View去掉向下偏移的64px

self.automaticallyAdjustsScrollViewInsets=NO;      self.scrollView.contentInset=UIEdgeInsetsMake(-64, 0, 0, 0); self.automaticallyAdjustsScrollViewInsets=NO; 相同的意思。

TableView 当前选中的行号。 默认会使哪一行选中 加入导航条后contentInset向下偏移的64

1.得到当前选中的行号     NSLog(@"%ld %s",  [self.tableView indexPathForSelectedRow].row,__func__); 2.默认选中表格的那一行     [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0 ]

内存填充越界 + malloc空间不够导致越界

【创建时间:2014-11-1 11:50】 [2014-10-31]:环境:系统:Linux版本:3.08    平台:Hisi3516c。 内存填充越界: 问题: 申请了一个2048字节局部静态的变量存储一个固定RGB值,方便后续画框、线时快速copy。但是在第一次赋固定值时,越界了,导致内核自动向应用程序 发送信号 SIGBUS(7)给应用程序,导致应用程序异常

Flink SQL因类型错误导致MAX和MIN计算错误

背景 最近在做数据分析,用Flink SQL来做分析工具,因数据源的数据存在不太规范的数据格式,因此我需要通过SQL函数把我需要的数据值从VARCHAR类型的字段中把数据提取出来,然后再做MAX、MIN、SUM这些统计。怎料SUM算出来的结果准确无误,而MAX和MIN算出来的结果却始终不正确,最后发现原来是我用SQL函数提取VARCHAR类型的字段的数据,也是VARCHAR类型,所以导致MAX、

使用J-Link Commander查找STM32死机问题

接口:PA13,PA14,请勿连接复位引脚。 输入usb命令 这里我已经连接过了STM32F407VET6了。 再输入connect命令 这里我已经默认选择了SWD接口,4000K速率。 可以输入speed 4000命令选择4000K速率: 写一段崩溃代码进行测试: void CashCode(void){*((volatile uint32_t*) 0x080FFFFF)

二分查找(算法篇)

算法之二分查找 二分查找 概念: 针对于已经预先排序好的数据,每次将数据进行对半查找,然后看它中间的数据是否是要找的,如果是就返回中间位置,不是就判断该数据是在前半部分还是后半部,然后在进而取其中部,看其是否找到,然后如果还没找到就一直重复操作,直到找到为止,该算法时间复杂度为O(logn) 代码: int search(vector<int>& nums, int target) {i

MATLAB取整函数

1)fix(x) : 截尾取整. >> fix( [3.12 -3.12]) ans =      3    -3 (2)floor(x):不超过x 的最大整数.(高斯取整) >> floor( [3.12 -3.12]) ans =      3    -4 (3)ceil(x) : 大于x 的最小整数 >> ceil( [3.12 -3.12])