LeetCode题练习与总结:x 的平方根--69

一、题目描述

给你一个非负整数 x ,计算并返回 x 的 算术平方根

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5

示例 1:

输入:x = 4
输出:2

示例 2:

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

提示:

  • 0 <= x <= 2^31 - 1

二、解题思路

1. 问题转化:将求整数 x 的平方根转化为在整数范围内寻找一个数 y,使得 y * y 最接近但不超过 x

2. 二分查找:初始化两个指针 left 和 right,分别指向 0 和 x

3. 迭代过程:在 left 和 right 之间进行二分查找。

4. 中间值计算:在每次迭代中,计算中间值 mid,其中 mid = left + (right - left) / 2

5. 条件判断

  • 如果 mid * mid 等于 x,则返回 mid
  • 如果 mid * mid 小于 x,则将 left 设置为 mid + 1
  • 如果 mid * mid 大于 x,则将 right 设置为 mid - 1

6. 结束条件:当 left 大于 right 时,right 就是我们要找的答案。

7. 特殊情况处理:当 x 为 0 或 1 时,直接返回 x

8. 结果返回:返回通过二分查找找到的平方根的整数部分。

三、具体代码

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

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 外层循环的次数取决于 x 的值。在最坏的情况下,当 x 接近 2^31 - 1 时,外层循环可能需要进行大约 16 次迭代(因为 2^31 - 1 的平方根大约是 46000)。
  • 每次迭代中,我们执行一次加法、一次减法、一次除法(或取模运算)和一次乘法。这些操作的时间复杂度都是 O(1)。
  • 因此,总的时间复杂度是 O(log(x)),其中 x 是输入的整数。
2. 空间复杂度
  • 代码中只使用了几个变量,如 leftright 和 result,这些变量的大小与输入无关,因此它们的空间复杂度是 O(1)。
  • 没有使用额外的数据结构,如数组或链表,因此空间复杂度不会超过 O(1)。

五、总结知识点

  1. 整数平方根的计算:代码实现了一个函数 mySqrt,用于计算一个非负整数 x 的平方根。

  2. 二分查找算法:使用二分查找算法来逼近 x 的平方根。二分查找是一种在有序数组中查找特定元素的搜索算法,其时间复杂度为 O(log n),其中 n 是数组的长度。

  3. 边界条件处理:在函数开始时,对特殊情况 x == 0 和 x == 1 进行了特殊处理,直接返回 x,因为这些情况下平方根就是 x

  4. 位运算:在计算中间值 mid 时,使用了位运算 (right - left) / 2 来避免整数溢出的问题。

  5. 条件判断:使用 if-else 语句来根据 mid * mid 与 x 的关系调整搜索范围。

  6. 循环结构:使用 while 循环来迭代搜索过程,直到找到合适的平方根。

  7. 整数运算:代码中使用了整数运算,包括加法、减法、除法和取模运算。

  8. 返回结果:函数返回找到的平方根的整数部分。

  9. 错误处理:虽然在这个特定的问题中没有直接处理错误情况,但代码的结构允许在将来扩展错误处理逻辑。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口压力测试 jmeter--入门篇(一)

一 压力测试的目的 评估系统的能力识别系统的弱点&#xff1a;瓶颈/弱点检查系统的隐藏的问题检验系统的稳定性和可靠性 二 性能测试指标以及测算 【虚拟用户数】&#xff1a;线程用户【并发数】&#xff1a;指在某一时间&#xff0c;一定数量的虚拟用户同时对系统的某个功…

SpringBoot多数据源AOP(四)

SpringBoot多数据源之AOP&#xff08;四&#xff09; 1.自定义注解2.切面类3.使用注解 1.自定义注解 这里定义了一个注解WR&#xff0c;作用在方法和类上&#xff0c;同时注解中value的默认值为W Target({ElementType.METHOD, ElementType.TYPE}) Retention(RetentionPolicy.R…

OpenMesh 网格平均曲率计算

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 根据 Laplace-Beltrami 算子与平均曲率法向的关系: 又根据余切 Laplace-Beltrami 算子的定义: 其中 Ai 为该点邻域面积,取 Voronoi cell 面积如下: 得到

儿童悬吊训练系统都有哪些锻炼形式

儿童悬吊训练作为一种创新的儿童训练方法&#xff0c;旨在结合儿童的身心发展特点&#xff0c;通过儿童悬吊系统的巧妙运用&#xff0c;达到提升儿童各项功能能力的目的。治疗师在运用悬吊系统对儿童进行训练时&#xff0c;必须紧密结合儿童的发育规律与自身功能水平&#xff0…

PACNet CellNet(代码开源)|bulk数据作细胞分类,评估细胞命运性能的一大利器

文章目录 1.前言2.CellNet2.1CellNet简介2.2CellNet结果 3.PACNet3.1安装R包与加载R包3.2加载数据3.3开始训练和分类3.4可视化分类过程3.5可视化分类结果 4.细胞命运分类和免疫浸润比较 1.前言 今天冲浪看到一个细胞分类性能评估的R包——PACNet&#xff0c;它与转录组分析方法…

Prometheus + Grafana 搭建监控仪表盘

目标要求 1、需要展现的仪表盘&#xff1a; SpringBoot或JVM仪表盘 Centos物理机服务器&#xff08;实际为物理分割的虚拟服务器&#xff09;仪表盘 2、展现要求: 探索Prometheus Grafana搭建起来的展示效果&#xff0c;尽可能展示能展示的部分。 一、下载软件包 监控系统核心…

Spring Cloud Gateway集成聚合型Spring Boot API发布组件knife4j,增强Swagger

大家都知道&#xff0c;在前后端分离开发的时代&#xff0c;前后端接口对接是一项必不可少的工作。 可是&#xff0c;作为后端开发&#xff0c;怎么和前端更好的配合&#xff0c;才能让自己不心累、脑累&#xff0c;直接扔给前端一个后端开放api接口文档或者页面&#xff0c;让…

Unity之OpenXR+XR Interaction Toolkit快速监听手柄任意按键事件

前言 当我们开发一个VR时,有时希望监听一个手柄按键的点击事件,或者一个按钮的Value值等。但是每次有可能监听的按钮有不一样,有可能监听的值不一样,那么每次这么折腾,有点累了,难道就没有一个万能的方法,让我可以直接监听我想要的某个按钮的事件么? 答案是肯定的,今…

Android --- 布局与点击事件

View&#xff08;视图) 此类代表用户界面组件的基本构建块。视图占据屏幕上的一个矩形区域&#xff0c;负责绘图和事件处理。View 是widgets的基类&#xff0c;用于创建交互式 UI 组件&#xff08;按钮、文本字段等&#xff09;。 子类是布局ViewGroup的基类&#xff0c;布局是…

分类算法——朴素贝叶斯(四)

概率基础 1概率定义 概率定义为一件事情发生的可能性 扔出一个硬币&#xff0c;结果头像朝上 P(X)&#xff1a;取值在[0&#xff0c;1] 2女神是否喜欢计算案例 在讲这两个概率之前我们通过一个例子&#xff0c;来计算一些结果&#xff1a; 问题如下&#xff1a; 1、女神喜欢…

sql知识总结二

一.报错注入 1.什么是报错注入&#xff1f; 这是一种页面响应形式&#xff0c;响应过程如下&#xff1a; 用户在前台页面输入检索内容----->后台将前台输入的检索内容无加区别的拼接成sql语句&#xff0c;送给数据库执行------>数据库将执行的结果返回给后台&#xff…

2024第十五届蓝桥杯JavaB组省赛部分题目

目录 第三题 第四题 第五题 第六题 第七题 第八题 转载请声明出处&#xff0c;谢谢&#xff01; 填空题暂时可以移步另一篇文章&#xff1a;2024第十五届蓝桥杯 Java B组 填空题-CSDN博客 第三题 第四题 第五题 第六题 第七题 第八题 制作不易&#xff0c;还请点个赞支持…

数据结构-栈和队列刷题集(长期更新)

文章目录 万能计算器的实现以及源码分析1. leetcode 150 逆波兰表达式求值 万能计算器的实现以及源码分析 /*** 我们尝试写一个完整版的计算器,由于计算机不能很好的识别括号,所以一般要转换为逆波兰表达式求解* 思路解析 :* 1. 输入一个 中缀表达式* 2. 中缀表达式转化为list…

SpringBoot基于RabbitMQ实现消息可靠性

文章目录 1. ☃️概述2. ☃️生产者消息确认2.1 ❄️❄️概述2.2 ❄️❄️实战⛷️⛷️⛷️2.2.1 修改配置⛷️⛷️⛷️2.2.2 定义 Return 回调⛷️⛷️⛷️2.2.3 定义ConfirmCallback 3. ☃️消息持久化3.1 ❄️❄️交换机持久化3.2 ❄️❄️队列持久化3.3 ❄️❄️消息持久化…

进程、线程和协程

进程、线程和协程 进程是程序的执行实例 线程是进程的执行路径 协程是基于线程之上但又比线程更加轻量级的存在 进程与线程的区别 线程是程序执行的最小单位&#xff0c;而进程是操作系统分配资源的最小单位 进程和程序的区别 程序&#xff1a;执行特定任务的一串代码&a…

牛客Linux高并发服务器开发学习第二天

Gcc编译 利用gcc 生成应用时如果不加-o 和应用名&#xff0c;默认生成a.out 可以用./ a.out打开 Gcc工作流程 可执行程序Windows系统中为.exe Linux系统中为.out g也可以编辑c程序 gcc也可以编译cpp代码&#xff0c;只是在编译阶段gcc不能自动共和C程序使用的库进行联接&…

JS-43-Node.js02-安装Node.js和npm

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;可以让JavaScript实现后端开发&#xff0c;所以&#xff0c;首先在本机安装Node.js环境。 一、安装Node.js 官网&#xff1a;下载 Node.js 默认两个版本的下载&#xff1a; 64位windows系统的LTS(Long Tim…

CST电磁仿真物体表面的Sheet结构和生成3D Model【基础教程】

由Sheet结构生成3D Model 使用Shell Solid and Thicken Sheet&#xff01; Modeling > Tools > Shape Tools > Shell Solid or Thicken Sheet Shell Solidor ThickenSheet会根据不同类型的模型提供两种完全不同的功能。 如033.由3D Model生成Cavity 所述&#xff…

UE5 GameplayAbility 源码定义解析

这一篇文章主要是对GA的源码定义文件的解析&#xff0c;方便后续学习对GA内部的内容做一个了解&#xff0c;而不是去学习GA的实现。 首先对源码注释进行一个了解 // Copyright Epic Games, Inc. All Rights Reserved.#pragma once#include "CoreMinimal.h"// 包含核…

从日志读取关键数据,按照相关日期进行数据分析

分析靠近后向挡墙的距离 import os import re import sys import matplotlib.pyplot as plt from datetime import datetimedef process_distance_data(file_path):distances []timestamps []try:with open(file_path, r, encodingutf-8, errorsignore) as file:for line in…