首页 > 其他分享 >【二分查找】LeetCode 69. x 的平方根

【二分查找】LeetCode 69. x 的平方根

时间:2023-05-07 09:03:46浏览次数:48  
标签:right int mid 查找 69 平方根 LeetCode left

题目链接

69. x 的平方根

思路

基本思路是在区间 \([1, x/2]\) 中使用二分查找(因为平方根必然小于 \(x/2\)),只不过需要注意一些细节。

  1. 因为使用的是闭区间查找,所以判断循环终止的条件为 \(left \leq right\)。
  2. 为了防止溢出,使用 mid = (right - left) / 2 + leftmid == x / mid 进行运算与判断。
  3. 同样是因为闭区间查找,所以在 \(mid\) 已经判断过的情况下,变换左右边界应该跳过 \(mid\),所以变换为 \(left = mid + 1\) 和 \(right = mid - 1\)。
  4. 因为终止条件为 \(left \leq right\),所以在跳出循环的时候必然有 \(right < left\),所以要返回的是 \(right\)。

代码

class Solution {
    public int mySqrt(int x) {
        if(x == 0){
            return 0;
        }
        if(x == 1){
            return 1;
        }

        int left = 1;
        int right = x / 2;
        while(left <= right){
            int mid = (right - left) / 2 + left;
            if(mid == x / mid){
                return mid;
            }else if(mid > x / mid){
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }

        return right;
    }
}

标签:right,int,mid,查找,69,平方根,LeetCode,left
From: https://www.cnblogs.com/shixuanliu/p/17378844.html

相关文章

  • 【二分查找】LeetCode 540. 有序数组中的单一元素
    题目链接540.有序数组中的单一元素思路假如不存在单个的元素,那么在奇数位置上总是成对元素的第一个元素,偶数位置上总是成对元素的第二个元素,但是如果加入了单个元素呢?我们可以看到在单个元素的左边这个特点没有变化,但是在单个元素的右边,奇数位置上总是成对元素的第二个元素,偶......
  • 69. 数组中数值和下标相等的元素
    classSolution{public:intgetNumberSameAsIndex(vector<int>&nums){intn=nums.size();intl=0,r=n-1;while(l<r){intmid=l+r>>1;if(nums[mid]<mid)l=mid+1;......
  • LeetCode 24. 两两交换链表中的节点
    题目链接:LeetCode24.两两交换链表中的节点本题不涉及算法,直接模拟就可以了,但是模拟的过程中,最好进行画图演示,不然容易出错。想要达到两两交换链表中节点的效果,就需要按照以下三个步骤进行。同时为了将头结点和非头结点统一处理,因此新建一个虚拟头结点,初始时,cur指向虚拟头结......
  • LeetCode 周赛 343(2023/04/30)结合「下一个排列」的贪心构造问题
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。今天是五一假期的第二天,打周赛的人数比前一天的双周赛多了,难道大家都只玩一天吗?这场周赛是LeetCode第343场单周赛,如果不考虑第一题摆烂的翻译,整体题目质量还是很不错哒。往期回顾:L......
  • LeetCode刷题记录|LeetCode热题100|226.翻转二叉树(easy)
    题目描述:给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。 思路与算法:从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转。如果当前遍历到的节点root的左右两棵子树都已经翻转,只需交换两棵子树的位置,即可完成以root为根节点的整棵子树的翻转。时间复......
  • LeetCode 206. 反转链表
    题目链接:LeetCode206.反转链表本题是链表题目中非常重要的一道题目--反转指针。解题方法有两种:1.双指针法2.递归法首先看双指针法:快指针总是在慢指针的前面,也就是每次将快指针的节点的next指针更新成指向慢指针,这样不就进行了反转嘛。完整代码如下:funcreverseList(hea......
  • [Leetcode] 0705. 设计哈希集合
    705.设计哈希集合EnglishVersion题目描述不使用任何内建的哈希表库设计一个哈希集合(HashSet)。实现MyHashSet类:voidadd(key)向哈希集合中插入值key。boolcontains(key)返回哈希集合中是否存在这个值key。voidremove(key)将给定值key从哈希集合中删除。如果......
  • LeetCode 203. 移除链表元素
    题目链接:LeetCode203.移除链表元素本题是一个经典的单链表删除元素的题目,主要注意的有两点:如果删除的元素是不是头元素,则直接p.Next=p.Next.Next即可如果删除的元素是头元素,则需要进行单独的处理forhead!=nil&&head.Val==val{head=head.Next}ifh......
  • LeetCode 59. 螺旋矩阵 II
    题目链接:LeetCode59.螺旋矩阵II本题不涉及算法,只是简单的模拟,但是由于边界条件比较多,因此容易出错。分析题干:题目要求按照右、下、左、上、这样的顺序对数组进行填充,填充的值为1~n*n,因此问题的关键就是找到待填充的位置,将其值赋值为i即可。由于填充的顺序是有规律的,因......
  • ABC269F 题解
    前言题目传送门!更好的阅读体验?题解区的方法思维难度都过大(?),提供一种极其容易的方法。思路题目就是求\(\sum\limits_{i=x_1}^{x_2}\sum\limits_{j=y_1}^{y_2}a_{i,j}\)。所以很容易想到先算\(\sum\limits_{j=y_1}^{y_2}a_{i,j}\)。这个并不困难:如果\(i\)是奇数,那一行应......