二分查找---求开方

求开方

69. Sqrt(x) (Easy)

Input: 4
Output: 2

Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since we want to return an integer, the decimal part 

题目描述:

??给定一个整数,求该整数的开方数。

思路分析:

??一个数 x 的开方 sqrt 一定在 0 ~ x 之间,并且满足 sqrt == x / sqrt。可以利用二分查找在 0 ~ x 之间查找 sqrt。

??对于 x = 8,它的开方是 2.82842...,最后应该返回 2 而不是 3。在循环条件为 l <= h 并且循环退出时,h 总是比 l 小 1,也就是说 h = 2,l = 3,因此最后的返回值应该为 h 而不是 l。

代码:

public int mySqrt(int x){
    if(x<=1){
        return x;
    }
    int l=1;
    int h=x;
    while(l<=h){
        int mid=l+(h-l)/2;
        int sqrt=x/mid;
        if(sqrt==mid)
            return mid;
        else if(mid>sqrt){
            h=mid-1;
        }else{
            l=mid+1;
        }
    }
    return h;
}

原文地址:https://www.cnblogs.com/yjxyy/p/11106128.html

时间: 2024-10-09 14:44:50

二分查找---求开方的相关文章

C++ 二分查找 求最近的值

上代码: <span style="font-size:18px;"> #include <iostream> #include <math.h> using namespace std; int BinarySearch(float *array, int aSize, float key) { if ( array == NULL || aSize == 0 ) return -1; int low = 0; int high = aSize -

CF 600B Queries about less or equal elements --- 二分查找

CF 600B 题目大意:给定n,m,数组a(n个数),数组b(m个数),对每一个数组b中的元素,求数组a中小于等于数组该元素的个数. 解题思路:对数组a进行排序,然后对每一个元素b[i],在数组a中进行二分查找第一个大于b[i]的位置即为结果 /* CF 600B Queries about less or equal elements --- 二分查找 */ #include <cstdio> #include <algorithm> using namespace std;

二分查找、三分查找求极点、二分求等比数列【模板】

二分查找: int a[110],N; int BinarySearch(int *a,int x) { int Left = a[1]; int Right = a[N]; while(Left <= Right) { int mid = (Left+Right)>>1; if(a[mid] == x) return mid; else if(a[mid] > x) Right = mid - 1; else Left = mid + 1; } return -1; } 三分查找

Leetcode题解——算法思想之二分查找

1. 求开方 2. 大于给定元素的最小元素 3. 有序数组的 Single Element 4. 第一个错误的版本 5. 旋转数组的最小数字 6. 查找区间 正常实现 Input : [1,2,3,4,5] key : 3 return the index : 2 public int binarySearch(int[] nums, int key) { int l = 0, h = nums.length - 1; while (l <= h) { int m = l + (h - l) /

二分查找总结

最近刷leetcode和lintcode,做到二分查找的部分,发现其实这种类型的题目很有规律,题目大致的分为以下几类: 1.最基础的二分查找题目,在一个有序的数组当中查找某个数,如果找到,则返回这个数在数组中的下标,如果没有找到就返回-1或者是它将会被按顺序插入的位置.这种题目继续进阶一下就是在有序数组中查找元素的上下限.继续做可以求两个区间的交集. 2.旋转数组问题,就是将一个有序数组进行旋转,然后在数组中查找某个值,其中分为数组中有重复元素和没有重复元素两种情况. 3.在杨氏矩阵中利用二分查

二分查找和斐波那契查找

二分查找 说明:查找的数组或列表必须是有序的,若无序,先进行排序 复杂度:时间复杂度 O(log2n),空间复杂度O(n) C++源码(递归和非递归两个版本) #include <iostream> using namespace std; int a[] = { 1, 2, 3, 4, 5, 6, 8 }; int BinarySearch1(int l, int r, int value) { int mid = (l + r) / 2; if (l == r && a[l

Java学习 (七)、数组,查找算法,二分查找法,冒泡排序,选择排序,插入排序

一.常用数组查找算法 工作原理:它又称为顺序查找,在一列给定的值中进行搜索,从一端的开始逐一检查每个元素,知道找到所需元素的过程. 例1:查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1 1 import java.util.Scanner; 2 public class LinearSearch{ 3 public static void main(String []argas) 4 { 5 int [] array={10,100,90,65,80,92}; 6 System.o

旋转有序数组的二分查找

要求 给定一个没有重复元素的旋转数组(它对应的原数组是有序的),求给定元素在旋转数组内的下标(不存在的返回-1). 例子 有序数组{0,1,2,3,4,5,6,7}对应的旋转数组为{3,4,5,6,7,0,1,2}(左旋.右旋效果相同). 查找元素5,返回结果2: 查找元素8,返回结果-1. 分析 可以轻易地想到遍历一遍O(n)时间可以得到结果,但是并不是最好的结果:利用有序的特点,可以轻易的想到二分查找的方法.经过旋转后的数组总是可以分为两个有序序列,如下图所示.旋转数组分成了红蓝两段有序序列

二分查找如何“花式”卖萌

二分查找,敢说这货埋在土里化到灰里应该都是认得的.其原理思想也是如此的简单明了,敲代码时都懒得经过反射弧.但事实上,据Knuth神犇描述,第一个木有bug的二分查找是这个算法发表之后12年在出现,但后来发现还是存在一些数组越界的小问题.而如今,我们大都是开门见山的学习被前辈们优化证明的算法,这也是“牛逼顿”所谓的站在巨人的肩膀上,却也如此. 回头来看二分查找如何“花式”卖萌. Problem:给定一个有序数组A,且数组中的元素存在重复,各大一个目标值target,求目标值在数组的的下标的区间(即