转载请注明:http://blog.youkuaiyun.com/zhouyelihua/article/details/46665931
二分查找的应用
二分查找作为 O(log(n)) 时间复杂度的查找算法得到了广泛的使用。
1.在已排序的数组中查找特定的元素。或者是满足条件的第一个元素
2.数学常用的求解方程的解,也是数学家所指的对半查找。
3.程序调试中用来定位错误语句
4….
二分查找的原始代码
<code class="language-c++ hljs vbscript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> binarySearch(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> A[],<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>,<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>,<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> target) { <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span><=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>) { <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>=(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>+<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>)/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(A[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>]<target) <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(A[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>]==target) return <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; } return -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li></ul>
注意事项 一:mid溢出
针对上文代码中
<code class="language-c++ hljs vbscript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>=(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>+<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>)/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
这一句代码有两个注意事项:
1.计算机方式有乘以 2n 或者是除以 2n 都可以利用移位代替。所以上述代码可以改为:
<code class="language-c++ hljs vbscript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>=(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>+<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>)>><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
2.第二个需要注意的是该段代码有可能产生溢出。当数组的中元素个数很多时候,至少大于 INT_MAX2 ,当left和right都是接近INT_MAX.二者相加就可能得到一个负数。这种办法有两个。
2.1将mid定义成
<code class="language-c++ hljs vbnet has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">long</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">long</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">mid</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>2.2
<code class="language-c++ hljs vbscript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>+(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>-<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>)>><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
注意事项 二:常数步的前进
这个错误在编程珠玑中也有提到的,但是自己还是经常放错误。
还是原来的那段代码很多人容易写成
<code class="language-c++ hljs vbscript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> binarySearch(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> A[],<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>,<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>,<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> target) { <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span><=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>) { <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>=(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>+<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>)/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(A[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>]<target) <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(A[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>]==target) return <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>; } return -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li></ul>
很多人在这时候可以很清楚的意识到上述中
<code class="language-c++ hljs vbscript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> ==》 <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> ==》 <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>; </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>
此处得特别注意是这样很容易掉入陷阱当中
比如当
所以在写二分查找时候一定记住要 有常数步的前进 。
LeetCode实例
这里在leetcode上找了一个应用来说明问题
链接地址https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/
题目:
Follow up for “Find Minimum in Rotated Sorted Array”:
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element.
The array may contain duplicates.
<code class="language-c++ hljs vbscript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> Solution { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>: <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> findMin(vector<<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span>>& nums) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(nums.<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">empty</span>()) return <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>=nums.size()-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>(nums[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>]>=nums[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>]) { <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>=(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>+<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>)>><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(nums[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>]>nums[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>]) <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(nums[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>]>nums[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>]) <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(nums[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>]==nums[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>]&&nums[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>]==nums[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>]) { <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> tmp=nums[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>]; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> i=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>;i<<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>;i++) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(tmp>nums[i]) tmp=nums[i]; return tmp; } } return nums[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>]; } };</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li></ul>
本人在写上述代码时候就是放了第二个错误。
<code class="language-c++ hljs vbscript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>; </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>
只要有一个常数步就可以在邻近的两个元素避免死循环。
第二道二分查找题目https://leetcode.com/problems/sqrtx/
Sqrt(x) Total Accepted: 55059 Total Submissions: 238405 My Submissions Question Solution
Implement int sqrt(int x).
Compute and return the square root of x
<code class="language-c++ hljs vbscript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> Solution { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>: <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> mySqrt(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> x) { <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">int</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>=x; long long <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span>(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span><=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>) { <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>=(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>+<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>)/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>*<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span><x) <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>*<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>>x) <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">right</span>=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> return <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">mid</span>; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>*<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>>x) return <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; return <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">left</span>; } };</code>