`
frank-liu
  • 浏览: 1666045 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

leetcode: Sqrt(x)

 
阅读更多

问题描述:

Implement int sqrt(int x).

Compute and return the square root of x.

 

原问题链接:https://leetcode.com/problems/sqrtx/

 

问题分析

 这个问题的解决办法有若干种,主要的目的是通过给定的范围去尝试凑一个和给定目标值最接近的结果。我们针对几种常见的解法做讨论。

 

二分法

  我们知道,求一个整数的平方根,而且还要求这个值取整数的话,我们可以参照二分查找的思路。首先取给定范围的最大和最小值,针对x来说,它的平方根所能取的最小值是0,而它的最大值肯定会小于x / 2 + 1。所以我们以这两个值作为判断查找的上下限。每次取它们的中间值mid, 直到mid * mid == x。

  详细实现如下:

 

public class Solution {
    public int mySqrt(int x) {
        long i = 0;
        long j = x / 2 + 1;
        while (i <= j) {
            long mid = (i + j) / 2;
            if (mid * mid == x)
                return (int)mid;
            if (mid * mid < x)
                i = mid + 1;
            else
                j = mid - 1;
        }
        return (int)j;
    }
}

  这种方法的实现效率比较高,在时间复杂度上达到了O(lgN)。

 

逐位尝试法

  如果我们利用一些位运算的手法,可以发现另外一种思路。对于一个给定的32位整数来说,它的平方根值可能最多只能到16位,因为两个16位的值相乘就可以达到32位了。我们可以取一个比特位,它最开始是最高的第16位上为1。这个值和我们给定的一个尝试判断的值进行或运算。这样根据得到的值求平方,判断它是否大于我们给定的值x,如果大于x的话,我们就将这个位置成0,否则就保持这个位的值为1。然后再考虑下一位。这样我们只要遍历16个位进行运算就可以了。相当于运行的时间复杂度是常量范围的。

  详细的实现如下:

 

public class Solution {
    public int mySqrt(int x) {
        long ans = 0;
        long bit = 1l << 16;
        while(bit > 0) {
            ans |= bit;
            if (ans * ans > x) {
                ans ^= bit;
            }
            bit >>= 1;
        }
        return (int)ans;
    }
}

 

参考材料

http://www.cnblogs.com/AnnieKim/archive/2013/04/18/3028607.html 

分享到:
评论

相关推荐

    leetcode : 69. x 的平方根

    实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

    leetcode切割分组-leetcode:leetcode

    069_sqrt.py # 实现开根号 136_single_number.py # 位操作:异或(xor)操作 x ^ 0 = x; x ^ x = 0 sum 001_two_sum.py # 求list中能加和成指定值的两个位置 015_3_sum**.py # 求list中能加和成0的三个值 数列 004_...

    leetcode343-LeetCode:LeetCodeJava解题

    第 343 章LeetCode解题笔记 代码请于src目录笔记见笔记目录下文档README 不更新了,直接提交。。。...69.Sqrt(x) 48.旋转图像 2017.10.30 46.排列 2017.10.29 40.组合和II 39.组合和112.路径和 201

    判断链表是否为回文链表leetcode-Leetcode:力码

    sqrt(int x)。 计算并返回 x 的平方根。 x 保证为非负整数。 1 位数 编写一个函数,该函数接受一个无符号整数并返回它具有的“1”位数(也称为汉明权重)。 例如,32 位整数“11”的二进制表示为 ...

    leetcode第321题-LeetCode:LeetCode问题的个人代码

    sqrt(int x)。 计算并返回 x 的平方根。 **单号** 说明:单号 给定一个整数数组,每个元素出现两次,除了一个。 找到那一个。 注意您的算法应该具有线性运行时复杂度。 你能在不使用额外内存的情况下实现它吗? **...

    leetcode双人赛-Leetcode:这个repo在我的java和python解决方案和描述中记录了Leetcode

    Sqrt(x) int mid long prod = mid * mid仍會overflow 要改成 long mid宣告才行 联合查找中的路径压缩 private int find(int x) { if (parent[x] == x) { return parent[x]; } parent[x] = find(parent[x]); // path ...

    leetcode 69: x的平方根

    实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 示例 1: 输入: 4 输出: 2 示例 2: 输入: 8 输出: 2 说明: 8 的平方根是 2...

    leetcode答案-LeetCode69:力扣69

    leetcode 答案 LeetCode 69 题 1.题目要求 实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 示例 1: 输入: 4 输出: 2 示例...

    leetcode530-LeetcodeSolution:Leetcode的解决方案

    69.Sqrt(x); 300.LongestIncreasingSubsequence。 338. 计数位数419. 棋盘中的战舰461. 汉明距离476.数字补码500.键盘排93.恢复IP地址344.反向字符串463.岛屿周长485.最大连续数513. 查找左下树值406.按高度重构队列...

    leetcode怎么销号-LeetCode-Solutions:我自己的LeetCode解决方案

    leetcode怎么销号 LeetCode-Solutions :green_heart:My own LeetCode solutions No. Problem LeetCode 力扣 ...Sqrt(x) Easy 二分、牛顿迭代 0070 Climbing Stairs Easy 动态规划 0075 Sort Colors M

    LeetCode最全代码

    # [LeetCode](https://leetcode.com/problemset/algorithms/) ![Language](https://img.shields.io/badge/language-Python%20%2F%20C++%2011-orange.svg) [![License]...

    leetcode2sumc-Leetcode_questions:Leetcode_questions

    69.Sqrt(x) (c++:二元除法) 70.Climbing Stairs(c++:Dynamic Programming) 83.从排序列表中删除重复项(c++) 88.Merge Sorted Array(c++) 00 94.Binary Tree Inorder Traversal(c++:tree traversal inorder) 100.Same...

    leetcode-js:算法和数据结构是一个程序员的灵魂,LeetCode JavaScript TypeScript 题解

    69.x 的平方根 (Sqrt(x)) 70.爬楼梯 (Climbing Stairs) 83.删除排序链表中的重复元素 (Remove Duplicates from Sorted List) 88.合并两个有序数组 (Merge Sorted Array) 100.相同的树 (Same Tree) 104.二叉树的最大...

    leetcode题库-algorithm:acwing,leetcode,kickstart,算法模板,PAT等等

    x 10^8次汁算,如果题目给出的时间限制カ1s,那么你选择的算法执行的计算次数最多应该在10^8量级オ有可能解决这个题目。一般O(n)的算法能解决的数据范围在n &lt; 10^8。 O(n*logn)的算法能解决的数据范围在n &lt;= 10...

    LeetCode解题总结

    11.2 Sqrt(x) 12. 贪心算法 12.1 跳台阶游戏 12.2 买卖股票的最佳时机 12.2.1 最多允许交易一次 12.2.2 可以交易任意多次 12.2.3 最多可以交易两次 12.2.4 可以交易任意多次 12.2.5 交易后需要停止一段时间 12.3 ...

    leetcode卡-Datawhale-DatasSructure-Sorting-binarySearch:Day3-DataWhale-D

    leetcode卡 Datawhale-DatasSructure-Sorting-binarySearch 第三个任务(2天) 排序 1.实现归并排序、快速排序、插入排序、冒泡...Sqrt(x) (x 的平方根) :OK_hand: 最近在准备星期六的考试,先打卡,剩下的之后补上。

    leetcode曼哈顿距离-computational-geometry:计算几何

    leetcode 天线距离两点之间的距离 曼哈顿距离 定义为 Math.abs(x2-x1) + Math.abs(y2-y1)。 切比雪夫距离 众所周知,给定点 (x, y) 并且您需要计算它们之间的曼哈顿距离 而不是使用 |x1-x2|+|y1-y2| 您可以先将所有...

    LeetCodeForCCC

    69.Sqrt(X)-简单 704.Binary Search-简单 35.搜索插入位置-简单 34.在排序数组中查找元素的第一个和最后一个位置-中 &gt;更新: 只能使用“如果if(nums [mid] &lt;target)left = mid + 1”来刷新范围。 并返回...

    javalruleetcode-JavaInterviewChecklist:要检查的Java事项

    java lru leetcode 面试清单 Java 比较器与比较器 哈希 静止的 例外 线 泛型 算法 链表 Linked List Cycle Remove ...例如:sqrt(x) 平方根 : 数字的第一次和最后一次出现: 排序数组的旋转次数:

    lrucacheleetcode-Python_DataStruc-Algo:Leetcode&Lintcode数据结构和算法

    Sqrt(x) 二分查找 (0071)。 简化路径堆栈 (0076)。 最小窗口子串两个指针 (0121)。 买卖股票的最佳时机DP (0125)。 有效回文_两个指针_ (0138)。 使用随机指针哈希复制列表,O(1) 空间 (0139)。 断字DP (0140)。 断...

Global site tag (gtag.js) - Google Analytics