题目地址(69. Sqrt(x))

https://leetcode-cn.com/problems/sqrtx/

题目描述

  1. 给你一个非负整数 x ,计算并返回 x 算术平方根
  2. 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去
  3. 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5
  4. 示例 1
  5. 输入:x = 4
  6. 输出:2
  7. 示例 2
  8. 输入:x = 8
  9. 输出:2
  10. 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
  11. 提示:
  12. 0 <= x <= 231 - 1

前置知识


公司

  • 暂无

思路

使用二分查找的方式 如果x小于中值相乘就让max等于中值 快速的求出值

关键点


代码

  • 语言支持:Java

Java Code:

  1. class Solution {
  2. public int mySqrt(int x) {
  3. //如果x=1的话 返回1
  4. if(x==1){
  5. return 1;
  6. }
  7. int min = 0;
  8. int max = x;
  9. while(max-min>1){
  10. int f = (min+max)/2;
  11. //使用x/f<f而不是x<f*f是因为防止溢出
  12. if(x/f<f){
  13. max = f;
  14. }else{
  15. min = f;
  16. }
  17. }
  18. return min;
  19. }
  20. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:69. Sqrt(x) - 图1#card=math&code=O%28logn%29&id=blhgo)
  • 空间复杂度:69. Sqrt(x) - 图2#card=math&code=O%28n%29&id=XjxJ9)