Sqrt(x) - LintCode

examination questions

Implement int sqrt(int x).

Compute and return the square root of x.

Example

sqrt(3) = 1

sqrt(4) = 2

sqrt(5) = 2

sqrt(10) = 3

Challenge

O(log(x))


解题代码

class Solution {
public:
    /**
    * @param x: An integer
    * @return: The sqrt of x
    */
    int sqrt(int x) {

        if (x == 1){
            return 1;
        }

        long long int temp = x / 2;
        int deposit;
        while (true){
            if (temp * temp > x){
                deposit = temp;
                temp = temp / 2;
            }
            else{
                if ((temp + 1)*(temp + 1) > x){
                    return temp;
                }
                else{
                    temp = (deposit + temp) / 2;
                }
            }
        }
    }
};

算法分析

使用二分法,给定一个要求的数,然后分半,若该数的平方大于给定的数,则对该数进行平分,如果平分后的平方小于给定的数,那么取该数与平分前的数的中数进行平方,每一次平方后如果该数是大于给定的数的,那么检测与该数小1的数的平方是否小于给定的数,如果是,那么该数为结果。

代码解析

class Solution {
public:
    /**
    * @param x: An integer
    * @return: The sqrt of x
    */
    int sqrt(int x) {

        if (x == 1){ //如果为1,那么直接得出结果
            return 1;
        }

        long long int temp = x / 2; //二分
        int deposit; //用于二分前的值,存放
        while (true){
            if (temp * temp > x){ //大于就二分
                deposit = temp; //存放
                temp = temp / 2; //二分
            }
            else{
                if ((temp + 1)*(temp + 1) > x){ //如果+1的平方大于x的话,那么就是该值
                    return temp;
                }
                else{
                    temp = (deposit + temp) / 2; //二分前与二分后的中值
                }
            }
        }
    }
};
时间: 2024-12-18 07:20:44

Sqrt(x) - LintCode的相关文章

[LintCode]sqrt(x)

法1:二分 1 class Solution { 2 public: 3 /** 4 * @param x: An integer 5 * @return: The sqrt of x 6 */ 7 int sqrt(int x) { 8 // write your code here 9 long long l = 1, r = x; 10 while(l<r) 11 { 12 long long m = (l+r)/2; 13 if(m*m>x) r = m-1; 14 else 15 {

[lintcode the-smallest-difference]最小差(python)

题目链接:http://www.lintcode.com/zh-cn/problem/the-smallest-difference/ 给定两个整数数组(第一个是数组 A,第二个是数组 B),在数组 A 中取 A[i],数组 B 中取 B[j],A[i] 和 B[j]两者的差越小越好(|A[i] - B[j]|).返回最小差. 排好序后用两个指针分别扫描两个数组,每次更新他们的差值的绝对值.并且依据他们两个数字的大小来决定谁来移动指针. 1 class Solution: 2 # @param

[leedcode 69] Sqrt(x)

Implement int sqrt(int x). Compute and return the square root of x. public class Solution { //本题利用了牛顿迭代法:设r是f(x) = 0的根(x^2-k=f(x)),选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0 //)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值.

lintcode.44 最小子数组

最小子数组 描述 笔记 数据 评测 给定一个整数数组,找到一个具有最小和的子数组.返回其最小和. 注意事项 子数组最少包含一个数字 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题? Airbnb Amazon LinkedIn Cryptic Studios Dropbox Apple Epic Systems TinyCo Yelp Hedvig Zenefits Uber Snapchat Yahoo Microsoft Bloomberg Facebook Google

69. Sqrt(x)(LeetCode)

Implement int sqrt(int x). Compute and return the square root of x. 1 class Solution { 2 public: 3 int mySqrt(int x) { 4 long r = x; 5 while (r*r > x) 6 r = (r + x/r) / 2; 7 return r; 8 } 9 };

整数划分优化,时间复杂度O(n*sqrt(n))

基准时间限制:1 秒 空间限制:131072 KB 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2,3},共4种.由于数据较大,输出Mod 10^9 + 7的结果即可. Input 输入1个数N(1 <= N <= 50000). Output 输出划分的数量Mod 10^9 + 7. Input示例 6 Output示例 4 常见的方法是行不通的,这里dp[i][j]表示的是j个数字和为i的情况dp[i][j] = dp[i -

lintcode 66.67.68 二叉树遍历(前序、中序、后序)

AC代码: /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ public class Solution { /** * @param root: The r

[LintCode/LeetCode]——两数和、三数和、四数和

LintCode有大部分题目来自LeetCode,但LeetCode比较卡,下面以LintCode为平台,简单介绍我AC的几个题目,并由此引出一些算法基础. 1)两数之和(two-sum) 题目编号:56,链接:http://www.lintcode.com/zh-cn/problem/two-sum/ 题目描述: 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 1

Lintcode 469. 等价二叉树

----------------------------------------------- AC代码: /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */