题目:
思路:1.暴力解法:因为忽略了非负数,直接 i*i <= x <=(i+1)*(i+1)
2.二分法:
首先判断是不是 0 或者 1 这两种特殊情况,如果是,则返回这两个数字。
开始二分,设置左侧为 1,右侧范围为 x,形成闭区间 [1, x](数学表示,而不是数组)。
输入 8,形成闭区间 [1, 8]。
第一次遍历,Math.floor((1 + 8) / 2) 的值为 4,因为 4 * 4 = 16,该值大于 8,所以这时候闭区间变成:[1, 4]。
第二次遍历,Math.floor((1 + 4) / 2) 的值为 2,因为 2 * 2 = 4,该值小于 8,所以这时候闭区间变成:[2, 4]。
第三次遍历,Math.floor((1 + 4) / 2) 的值为 3,因为 3 * 3 = 9,该值大于 8,所以这时候闭区间变成:[2, 3]。
此时,因为 2 === 3 - 1 && 2² <= 8 && 3² > 8,所以我们找到了最终值,即 2
网友评论