69. x 的平方根(简单)

69. x 的平方根

  • 1. 题目描述
  • 2.详细题解
  • 3.代码实现
    • 3.1 Python
      • 方法一:逐个遍历
      • 方法二:二分查找
    • 3.2 Java

1. 题目描述

题目中转:69. x 的平方根

在这里插入图片描述

2.详细题解

    不能使用系统内置的函数,寻找某个数(假定为x)的算术平方根,并返回算术平方根的整数部分,最直观的方法是从0依次开始尝试所有小于等于x的数(假定为y),当y*y的积小于等于x时,继续遍历下一个数,直至y*y的积首次大于x时,此时y-1即为x的算术平方根的整数部分,如Python方法一逐个遍历实现。
  上述方法遍历的过程中,每次仅能排除判断一个数字是否满足,有没有办法一次性判断或者排除多个数字呢?这就是二分查找算法,简单的说,即待查数据需有序,每次判断时折中取中间值进行对比,以判断目标值可能存在的那一半,从而快速定位目标值,每次判断可以排除一半的空间大小。具体算法如下:

  • Step1:前置条件:个已排序的数组 arr 和待查找的元素 target。;
  • Step2:初始化:两个指针 left 和 right,分别指向数组的起始和结束位置;
  • Step3:计算中间元素的索引: mid = (left + right) / 2;
  • Step4:比较中间元素 arr[mid] 与 target;
  •    如果 arr[mid] == target,则找到目标值,返回 mid,程序结束;
  •    如果 arr[mid] < target,则目标值可能在 mid 的右侧,更新 left = mid + 1;
  •    如果 arr[mid] > target,则目标值可能在 mid 的左侧,更新 right = mid - 1;
  • Step5:当 left <= right 时,循环执行Step3_Step4.

  对于此题,是计算算术平方根的整数部分,因此等价于寻找首次平方之和大于x的数,该数减1即为x的算术平方根(假定x的算术平方根为y.z,其中y为整数部分,z为小数部分,y*y的结果是小于x,而(y+1)*(y+1)是大于x的)。因此,针对此题,二分查找算法在返回值方面有一点点不同,应当返回最后的右指针指向的值,为什么呢?因为right为最后一次mid值大于x时减1的值,其它的mid值均小于x,故最后一次大于x的mid值减1即为目标整数,即right。实现详见Python方法二和Java实现。

3.代码实现

3.1 Python

方法一:逐个遍历

class Solution:
    def mySqrt(self, x: int) -> int:
        left = 0
        while left * left <= x:
            left += 1
        return left-1

在这里插入图片描述

方法二:二分查找

class Solution:
    def mySqrt(self, x: int) -> int:
        left, right = 0, x//2
        while left <= right:
            mid = (left + right) // 2
            mul = mid * mid
            if mul == x:
                return mid
            elif mul < x:
                left = mid + 1
            else:
                right = mid - 1
        return right

在这里插入图片描述
  此时未通过x=1的测试用例,此时预期结果为1但返回0,仔细观察代码,right初始值为2整数x,对于1,结果为0,因此初始化出现了问题,优化如下:

class Solution:
    def mySqrt(self, x: int) -> int:
        left, right = 0, x//2+1
        while left <= right:
            mid = (left + right) // 2
            mul = mid * mid
            if mul == x:
                return mid
            elif mul < x:
                left = mid + 1
            else:
                right = mid - 1
        return right

在这里插入图片描述

3.2 Java

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

在这里插入图片描述
  对于测试案例x=2147395599运行错误,直接返回了right初始值的结果,说明一直触发的是中间值平方小于x,这明显是错误的,考虑到Java是严格声明和定义数据类型的,因此错误在于内存溢出,超出Java的int类型的取值范围,故中间值使用long整型,优化如下:

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

在这里插入图片描述

  执行用时不必过于纠结,对比可以发现,对于python和java完全相同的编写,java的时间一般是优于python的;至于编写的代码的执行用时击败多少对手,执行用时和网络环境、当前提交代码人数等均有关系,可以尝试完全相同的代码多次执行用时也不是完全相同,只要确保自己代码的算法时间复杂度满足相应要求即可,也可以通过点击分布图查看其它coder的code。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/762825.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

哈希表(C++实现)

文章目录 写在前面1. 哈希概念2. 哈希冲突3. 哈希函数4.哈希冲突解决4.1 闭散列4.1.1 线性探测4.1.2 采用线性探测的方式解决哈希冲突实现哈希表4.1.3 二次探测 4.2 开散列4.2.2 采用链地址法的方式解决哈希冲突实现哈希表 写在前面 在我们之前实现的所有数据结构中(比如&…

【详解】RV1106移植opencv-mobile库

文章目录 前言一、烧入镜像二、编译项目1.创建项目文件 三、移植四、运行文件五、总结 前言 硬件&#xff1a;瑞芯微Rv1106【Luckfox Pro\Max Pico、网线一根、USB线、串口助手、摄像头 软件&#xff1a;ubuntu 20.4 编译器&#xff1a;arm-rockchip830-linux-uclibcgnueabihf…

昇思25天学习打卡营第6天|网络构建

网络构建 概念模型模型参数 概念 神经网络模型是由神经网络层和Tensor操作构成的&#xff0c;mindspore.nn提供了常见神经网络层的实现&#xff0c;在MindSpore中&#xff0c;Cell类是构建所有网络的基类&#xff0c;也是网络的基本单元。一个神经网络模型表示为一个Cell&…

入选顶会ICML,清华AIR等联合发布蛋白质语言模型ESM-AA,超越传统SOTA

作为细胞内无数生化反应的驱动力&#xff0c;蛋白质在细胞微观世界中扮演着建筑师和工程师的角色&#xff0c;不仅催化着生命活动&#xff0c;更是构筑、维系生物体形态与功能的基础构件。正是蛋白质之间的互动、协同作用&#xff0c;支撑起了生命的宏伟蓝图。 然而&#xff0…

RK3568驱动指南|第十五篇 I2C-第166章 初步认识I2C

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

无线物联网练习题

文章目录 选择填空简答大题 选择 不属于物联网感知技术的是(A) A:ZigBee B:红外传感器 C:FRID D:传感器 ZigBee是一种无线通信技术&#xff0c;虽然它常用于物联网中作为设备之间的通信手段&#xff0c;但它本身并不是一种感知技术 关于物联网于与互联网的区别的描述&#xff…

在线疫苗预约小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;工作人员管理&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;疫苗管理&#xff0c;论坛管理&#xff0c;公告管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;公告&#xff0c;疫苗…

机器人控制系列教程之并联机器人简介

背景 根据其构件的连接是否构成闭环形式&#xff0c;机器人可分为串联机器人和并联机器人两种。对于串联机器人&#xff0c;其所有的构件以串联的结构形式连接起来&#xff0c;在空间组成一种开环结构&#xff0c;因而具有工作空间大&#xff0c;灵活性好等优点&#xff0c;但…

MySQL之高可用性和应用层优化(一)

高可用性 故障转移和故障恢复 在应用中处理故障转移 有时候让应用来处理故障转移会更加简单或者更加灵活。例如&#xff0c;如果应用遇到一个错误&#xff0c;这个错误外部观察者正常情况下是无法察觉的&#xff0c;例如关于数据库损坏的错误日志信息&#xff0c;那么应用可…

C++算法学习心得八.动态规划算法(6)

1.最长递增子序列&#xff08;300题&#xff09; 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&…

Kaggle竞赛——房价预测

目录 1. 特征分析1.1 数据集导入1.2 统计缺失值1.3 可视化缺失值1.4 缺失值相关性分析1.5 训练集和测试集缺失数据对比1.6 统计特征的数据类型1.7 数值型特征分布直方图1.8 数值型特征与房价的线性关系1.9 非数值型特征的分布直方图1.10 非数值型特征箱线图1.11 数值型特征填充…

代码随想录算法训练营第55天(py)| 单调栈 | 42. 接雨水*、84.柱状图中最大的矩形

42. 接雨水* 力扣链接 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 思路1 暴力 按列来计算。每一列雨水的高度&#xff0c;取决于&#xff0c;该列 左侧最高的柱子和右侧最高的柱子中&#xff0c;…

WMS、ERP、MES之间的关系

WMS&#xff08;仓库管理系统&#xff09;、ERP&#xff08;企业资源计划&#xff09;、MES&#xff08;制造执行系统&#xff09;是企业管理和运作中常见的三种系统&#xff0c;它们在不同的层面上发挥作用&#xff0c;但之间又有紧密的联系。三者之间的区别如下&#xff1a; …

【哈哈大一上学的全忘了,重开!!】STM32从零入门物联网开发

本笔记资料来源 &#xff1a;STM32物联网入门30步&#xff1d;单片机物联网入门教程 WIFI连接阿里云物联网CubeMXHAL库蓝牙ESP8266杜洋主讲_哔哩哔哩_bilibili IOT&#xff1a;Internet of things 学习目标&#xff1a; 1.掌握洋桃IoT开发板的各功能以及驱动与基本应用 2.掌…

【C++11:右值引用,列表初始化】

统一列表初始化&#xff1a; 构造函数的函数名与函数体之间增加一个列表&#xff0c;用于对成员初始化 在实例化对象时&#xff0c;支持单/多参数的隐式转化&#xff0c;同时也可以省略符号&#xff0c;让代码更简洁 右值的引用 左值&#xff1a; 左值与右值的重要区别就是能…

tkinter显示图片

tkinter显示图片 效果代码解析打开和显示图像 代码 效果 代码解析 打开和显示图像 def open_image():file_path filedialog.askopenfilename(title"选择图片", filetypes(("PNG文件", "*.png"), ("JPEG文件", "*.jpg;*.jpeg&q…

专题五:Spring源码之初始化容器上下文

上一篇我们通过如下一段基础代码作为切入点&#xff0c;最终找到核心的处理是refresh方法&#xff0c;从今天开始正式进入refresh方法的解读。 public class Main {public static void main(String[] args) {ApplicationContext context new ClassPathXmlApplicationContext(…

2.3章节Python中的数值类型

1.整型数值 2.浮点型数值 3.复数   Python中的数值类型清晰且丰富&#xff0c;主要分为以下几种类型&#xff0c;每种类型都有其特定的用途和特性。 一、整型数值 1.定义&#xff1a;整数类型用于表示整数值&#xff0c;如1、-5、100等。 2.特点&#xff1a; Python 3中的…

面试题-Spring家族与SpringIOC

1.spring家族的介绍 Spring简单图&#xff1a; 2.IOC原理 IOC就是原先代码里需要开发者实现对象的创建和关系依赖&#xff0c;反转交给SpringIOC容器管理对象的生命周期和对象之间的依赖关系。 依赖注入的方式&#xff1a; Setter&#xff1a;实现特定属性的public sette…

RedHat9 | podman容器-续集

一、管理容器存储和网络资源 使用容器来运行简单的进程&#xff0c;然后退出。可以配置容连续运行特定服务&#xff0c;如数据库服务。如果持续运行服务&#xff0c;需要向容器添加更多的资源&#xff0c;如持久存储或对其他网络的访问权限。 针对企业容器平台上的大型部署&a…
最新文章