首页 > 其他分享 >LeetCode习题——x 的平方根(二分查找)

LeetCode习题——x 的平方根(二分查找)

时间:2023-04-09 23:00:11浏览次数:43  
标签:right int mid 整数 LeetCode 习题 平方根 left


### x 的平方根

力扣链接:[x 的平方根 ](https://leetcode.cn/problems/sqrtx/)

#### 题目

> 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
>
> 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
>
> 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

> 示例 1:
>
> 输入:x = 4
>
> 输出:2
>
>
>
> 示例 2:
>
> 输入:x = 8
>
> 输出:2
>
> 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

> 提示:
>
> 0 <= x <= 231 - 1

#### 分析

>从题目的要求和示例我们可以看出,这其实是一个查找非负整数的问题,并且这个整数是有范围的。
>
>如果这个整数的平方**等于**输入整数,那么这个整数就是结果。
>
>如果这个整数的平方**大于**输入整数,那么这个整数肯定不是结果。
>
>如果这个整数的平方**小于**输入整数,那么这个整数**可能**是结果。
>
>因此我们可以使用「二分查找」来查找这个整数,不断缩小范围去找
>
>猜的数平方以后大了就往小了猜;
>
>猜的数平方以后恰恰好等于输入的数就找到了;
>
>猜的数平方以后小了,可能猜的数就是,也可能不是。

```java
public class Solution {
public int mySqrt(int x) {
// 特殊值判断
if (x <= 1) {
return x;
}
int left = 1;
int right = x / 2;
// 在区间 [left..right] 查找目标元素
while (left < right) {
int mid = left + (right - left + 1) / 2;
// 注意:这里为了避免乘法溢出,改用除法
if (mid > x / mid) {
// 下一轮搜索区间是 [left..mid - 1]
right = mid - 1;
} else {
// 下一轮搜索区间是 [mid..right]
left = mid;
}
}
return left;
}
}

class Solution {
public int mySqrt(int x) {
int left = 0;
int right = x;
int ans = -1;
while(left <= right){
int mid = (left + right) /2 ;
if((long)mid*mid > x){
right = mid - 1;
}else if (mid * mid <= x) {
// ans = mid;
left = mid + 1;
}
}
return ans;
}
}
```

>不管生活多么苦难,我们都要坚持下去。因为前方的路还很长,未来的日子更加美好。每一次的挑战都是成长的机会,每一次的努力都会有回报。相信自己,相信未来,让我们一起走向幸福的明天!

标签:right,int,mid,整数,LeetCode,习题,平方根,left
From: https://www.cnblogs.com/Heyking/p/17301373.html

相关文章

  • LeetCode 98.验证二叉搜索树
    1.题目:给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。有效二叉搜索树定义如下:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例1:输入:root=[2,1,3]输出:true来源:力扣(LeetCode......
  • java -- 练习题
    第一题1.定义一个Person类,要求有姓名和年龄,并且符合JavaBean标准,定义Student类继承Person,定义测试类,创建Student对象,要求创建Student对象的同时,指定Student对象的姓名为"张三",只能指定姓名不许指定年龄classPerson{privateStringname;privateintage;......
  • Leetcode(剑指offer专项训练)——DFS/BFS专项(2)
    课程顺序题目现在总共有numCourses 门课需要选,记为 0 到 numCourses-1。给定一个数组 prerequisites,它的每一个元素 prerequisites[i] 表示两门课程之间的先修顺序。 例如 prerequisites[i]=[ai,bi] 表示想要学习课程ai ,需要先完成课程bi 。请根据给出的......
  • leetcode56.合并区间-java
    1classSolution{2publicint[][]merge(int[][]intervals){3/*4思路:左区间排序,若intervals[i][0]>=intervals[i-1][1];则重叠5将重叠区间新建放入res数组里,没重叠则放入原数组6*/7List<int[]>......
  • Leetcode(剑指offer专项训练)——DP专项(8)
    最长递增路径题目给定一个 mxn整数矩阵 matrix,找出其中最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。不能在对角线方向上移动或移动到边界外(即不允许环绕)。链接DP但是依旧不能覆盖所有的情况classSolution{public:intlongest......
  • mysql 查询练习题
    1.查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数。selectd.deptno,d.dname,d.loc,r.countfromdeptd,(selectdeptno,count(*)countfromempgroupbydeptno)rwhered.deptno=r.deptno;2.列出薪金比smith高的所有员工。select*fro......
  • 06算术运算符和习题
    算数运算符建议:给符号两端预留空格+-*/除%求余,取模在生活中23除7等于3余2代码中23/7=323%7=2例子:publicstaticvoidmain(String[]args){//46天,包含了几周零几天intweeks=46/7;intdays=46%7;System.out.pr......
  • 2023年4月8日leetcode练习心得
    给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 来源:力扣(LeetCode)链接:https://leetcode.cn/problems/sing......
  • leetcode杨辉三角
    给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。出处:leetcode对于此题可以建立一个vector<vector<int>>,对外层开辟numRows行,对内层开辟从零开始每次加一个,并把头尾都置为一,然后根据杨辉三角的规律填入......
  • 机器学习(五):混合高斯聚类(求聚类标签)+PCA降维(3维降2维)习题
    使用混合高斯模型GMM,计算如下数据点的聚类过程:\(Data=np.array([1,2,6,7])\)均值初值为:\(\mu_1,\mu_2=1,5\)权重初值为:\(w_1,w_2=0.5,0.5\)方差:\(std_1,std_2=1,1\)\(K=2\)10次迭代后数据的聚类标签是多少?采用python代码实现:fromscipyimport......