【问题描述】

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

【解答思路】

1. 二分法(面试必备)

1.1 缩小边界 x/2
时间复杂度:O(logN) 空间复杂度:O(1)

Java 代码要注意到:如果中点 mid 声明为 int 类型,针对大整型测试用例通不过,因此变量需要声明为 long 类型。

public class Solution {public int mySqrt(int x) {// 注意:针对特殊测试用例,例如 2147395599// 要把搜索的范围设置成长整型// 为了照顾到 0 把左边界设置为 0long left = 0;// # 为了照顾到 1 把右边界设置为 x // 2 + 1long right = x / 2 + 1;while (left < right) {// 注意:这里一定取右中位数,如果取左中位数,代码会进入死循环// long mid = left + (right - left + 1) / 2;long mid = (left + right + 1) >>> 1;long square = mid * mid;//画图排除法思想 现象最简单的 if (square > x) {right = mid - 1;} else {left = mid;}}// 因为一定存在,因此无需后处理return (int) left;}}

1.2 常规思路 零神笔法

时间复杂度:O(logN) 空间复杂度:O(1)

class Solution {public int mySqrt(int x) {int l = 0, r = x, ans = -1;while (l <= r) {int mid = l + (r - l) / 2;if ((long)mid * mid <= x) {ans = mid;l = mid + 1;}else {r = mid - 1;}}return ans;}
}
2.牛顿法

牛顿法得到的是平方根的浮点型精确值(可能会有一定误差),根据题目中的要求,把最后得到的这个数转换为 int 型,即去掉小数部分即可


时间复杂度:O(logN) 空间复杂度:O(1)

public class Solution {public int mySqrt(int a) {long x = a;while (x * x > a) {x = (x + a / x) / 2;}return (int) x;}
}
3. 袖珍计算器算法 零神提供新思路


时间复杂度:O(logN) 空间复杂度:O(1)

class Solution {public int mySqrt(int x) {if (x == 0) {return 0;}int ans = (int)Math.exp(0.5 * Math.log(x));return (long)(ans + 1) * (ans + 1) <= x ? ans + 1 : ans;}
}
4. 库函数 皮一下很开心
public int mySqrt(int x) {return  (int)Math.sqrt(x);}

【总结】

1. 一题多解 乐趣多
2.二分法 注意细节
3. 一人之下 真好看

参考链接:https://leetcode-cn.com/problems/sqrtx/solution/x-de-ping-fang-gen-by-leetcode-solution/
参考链接:https://leetcode-cn.com/problems/sqrtx/solution/er-fen-cha-zhao-niu-dun-fa-python-dai-ma-by-liweiw/

[Leedcode][JAVA][第69题][x的平方根][二分查找][数学]相关推荐

  1. [Leedcode][JAVA][第287题][寻找重复数][HashSet][二分查找][快慢指针]

    [问题描述][中等] 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数.输入: ...

  2. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  3. [Leedcode][JAVA][第470题][Ran7()实现Rand10()]

    [问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...

  4. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  5. [Leedcode][JAVA][第300题][最长上上子序列][动态规划][压缩空间]

    [问题描述][中等] 给定一个无序的整数数组,找到其中最长上升子序列的长度.示例:输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它 ...

  6. [Leedcode][JAVA][第887题][鸡蛋掉落][谷歌面试][动态规划]

    [问题描述] [887. 鸡蛋掉落] 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑.每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去.你知道存在楼层 F ,满足 ...

  7. [Leedcode][JAVA][第4题][寻找两个正序数组中的中位数][二分查找][双指针]

    [问题描述][困难] 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)).你可以假设 ...

  8. LeetCode #69 x的平方根 二分查找

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

  9. JS刷题第一天| 704. 二分查找、27. 移除元素

    704. 二分查找 题目链接:力扣 文章讲解:代码随想录 视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili 看 ...

最新文章

  1. ffmpeg architecture(上)
  2. 成功解决TypeError: take() got an unexpected keyword argument ‘fill_value‘
  3. java分页查询oracle_Java中实现Oracle分页查询
  4. git提交代码,合并同步分支
  5. 将数字转化为电话号码(忽略全局属性)
  6. matlab 不单调 插值,三组无关数据进行MATLAB画三维图不采用插值的方法该怎么办...
  7. vue3.0 execle 导出功能实现
  8. Unity Panel 控件
  9. 冒死解密,微信逆向:破解聊天记录文件!
  10. 期权波动率套利策略之谜
  11. 【掩码机制】解决LSTM中特征长度不一致问题
  12. 【2020年面经】【通用篇】拿了阿里、滴滴、shopee几家公司offer后的经验总结
  13. 服务器中勒索病毒解密恢复 SQL数据库中勒索病毒解密恢复 SQL数据库被加密恢复...
  14. 求最长递增子序列个数——C++
  15. 阿里云ACP认证之云服务器ECS知识整理(考题占比 31%)
  16. 三菱fx5u plc项目模板程序(含触摸屏程序) 程序注释全面,用的三菱fx5u系列plc和威纶触摸屏
  17. ps aux 进程状态为 I (大写i)
  18. pdf批量修改属性工具软件使用教程
  19. 解密淘宝优惠群泛滥的原因
  20. 美通企业日报 | 微软和宝马推出开放式制造平台;爱彼迎Plus在中国发展势头强劲...

热门文章

  1. python安装lxml,在windows环境下
  2. iOS原生CIFilter创建二维码
  3. 使用jquery获取url及url参数的方法及定义JQuery扩展方法
  4. python学习之wxPython
  5. 【iOS开发每日小笔记(二)】gitHub上的开源“瀑布流”使用心得
  6. linux 下zip文件的压缩和解压
  7. 使用ftp上传文件到Unix系统注意事项
  8. lambda写法(多参数)
  9. log4j自定义配置文件(SpringMVC项目)
  10. 基于Linux系统的手机,中国最新超算操作系统揭秘:基于Linux