x的平方

  • 1. 题目
  • 2. 思路
  • 3. 代码实现
  • 4. 总结

1. 题目

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

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

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

示例 1:

输入:x = 4
输出:2
示例 2:

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

提示:

0 <= x <= 231 - 1

2. 思路

因为只保留整数部分,所以ans 是满足 k2 ≤ x 的最大 k 值

解法一:对数函数求平方根

【注意:返回值为浮点数,会产生精度问题】

解法二:二分法搜索k

解法三:牛顿迭代法

  1. 将题目转化成求解函数零点
  2. 牛顿迭代法的本质是借助泰勒级数,从初始值开始快速向零点逼近。
  3. 实现过程
  4. 实现细节

3. 代码实现

解法二:二分法搜索k

class Solution {public:int mySqrt(int x) {int left = 0;int right = x;int ans = -1;while(left <= right){int middle = left + (right - left) / 2;if((long long)middle*middle <= x){ans = middle; // 满足条件的k, 最后更新得到ansleft = middle + 1;}else{right = middle - 1;}}return ans;}};

复杂度分析

  • 时间复杂度:O(logx)O(logx)O(logx),即为二分查找需要的次数。
  • 空间复杂度:O(1)O(1)O(1)

解法三:牛顿迭代法

class Solution {public:int mySqrt(int x) {if (x == 0) return 0;// 设置迭代初始值double x0 = x;double C = x;while(true){double x1 = 0.5 * (x0 + C/x0); // 根据公式得到下一个点x(i+1)if(fabs(x1 - x0) < 1e-7) break;x0 = x1; // 更新点xi}return int(x0);}};

复杂度分析

  • 时间复杂度:O(logx)O(logx)O(logx),此方法是二次收敛的,相较于二分查找更快。
  • 空间复杂度:O(1)O(1)O(1)。

4. 总结

1. 溢出判断

(long long)middle*middle <= x
  • 这里middle的取值范围为0 <= middle <= 231 - 1,则0 <= middle * middle < 262
  • 而int型变量的取值范围为231 <= middle <= 231
  • 因为需要将变量类型转换为long

2. 已知直线斜率和直线上一点,直线方程的表达公式

3. abs()与fabs()

  • abs( )主要用于对求整数的绝对值,在“stdlib.h”(或 )头文件里面。
  • 而fabs( )主要是求精度要求更高的double ,float 型的绝对值,在< cmath>头文件里。
  • 两者在只#include< cmath>时都可以使用。

4. 订正数学习惯写法

 double x1 = 1/2 * (x0 + C/x0); // 根据公式得到下一个点x(i+1)

写成这种形式会一直循环下去,因为这里的1/2会得到0!

1.1.3 数组——x的平方(Leetcode 69)相关推荐

  1. 【分治】LeetCode 69. Sqrt(x)

    LeetCode 69. Sqrt(x) 参考网址:http://www.cnblogs.com/grandyang/p/4346413.html Solution1: class Solution ...

  2. LeetCode #69 x的平方根 二分查找

    LeetCode #69 x的平方根 题目描述 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍 ...

  3. LeetCode 69. x 的平方根:二分查找法实现自定义的函数:x 的平方根

    LeetCode 69. x 的平方根:二分查找法实现自定义的函数:x 的平方根 题目描述 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型 ...

  4. 二维数组删除_「leetcode」数组:总结篇!(一文搞懂数组题目)

    数组理论基础 数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力 也就是说,想法很简单,但实现起来 可能就不是那么回事了. 首先要知道数组在内存中的存储方 ...

  5. 用数组建立二叉树(LeetCode二叉树测试)

    我在做leetcode上的二叉树题目,经常会报错,但是又不知道错在哪里,于是我想到在vscode上调试我写的代码,于是我参考了leetcode 二叉树的建立.释放内存.层序遍历输出,C++ 做了简化, ...

  6. c语言数组求逆序对,LeetCode 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ 题目 在数组中的两个数字,如果 ...

  7. 【数据结构】树状数组详解(Leetcode.315)

    前言 最近做题时遇到一个关于树状数组的题力扣https://leetcode-cn.com/problems/count-of-smaller-numbers-after-self/但是CSDN上仅有 ...

  8. Acwing语法基础课第八次课(1)751. 数组的左方区域最小数和它的位置741. 斐波那契数列740. 数组变换753. 平方矩阵 I

    751. 数组的左方区域 题目 提交记录 讨论 题解 视频讲解 输入一个二维数组 M[12][12],根据输入的要求,求出二维数组的左方区域元素的平均值或元素的和. 数组的两条对角线将数组分为了上下左 ...

  9. L350 两个数组的交集 ii leetcode

    1. 一个错误的思路:用小的那个数组,逐个扫描大的数组,如果存在,就加入新Arraylist.但是,这个算法有个很严重的问题,没有考虑次数 比如: {3,1,2} {1,1} 这样输出的是{1,1}, ...

最新文章

  1. 一份忧伤的大厂生存百科
  2. 通用窗口类 Inventory Pro 2.1.2 Demo1(下)
  3. UGUI的优点新UI系统四 开源
  4. git遇到的一些问题
  5. Apache下PHP的几种工作方式
  6. Entity Framework 基础
  7. linux核能软件,ARM big.LITTLE大小核架构在Linux和Android内核下多核调度算法
  8. python将2个列表list合并到1个列表使用appenden_【新手入门】20个很实用的 Python 学习小技巧...
  9. AT91SAM9260EK-38k产生原理
  10. 想当年,我也是斩获20+大厂offer的收割机!
  11. 1007 素数对猜想(C语言)
  12. delphi 如何知道 Treeview,Listview 当前最上面显示的节点
  13. Python 学习笔记 (6)—— 读写文件
  14. iptables详解(2):iptables管理
  15. 宋代词人前十名都有谁?第一名更是震铄古今最全能的大文豪
  16. C语言汉字在内存中如何存储
  17. 领接矩阵结构的图的遍历(广度和深度遍历)
  18. 【洛谷】P1894 完美的牛栏
  19. mysql远程备份_mysql实现自动远程备份一办法
  20. Win10环境下安装TensorFlow 2.0简明教程

热门文章

  1. 4、基本命令-系统管理
  2. imx6q ssi1 配置成CPU为主,codec PCM从模式 SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_CBS_CFS
  3. 农夫住房抵押贷款叫醒农村沉睡资本
  4. 2011.4.5 凌晨 3:50分
  5. 《七堂极简物理课》总结
  6. ROM,PROM,EPROM,EEPROM及FLASH存储器的区别
  7. 论文中英文摘要、目录、每章的页眉不同,页脚处的页码自动连续设置方法
  8. MBT测试实例:做个“机器人”,使其随机、持续的对“web页面”做交互性测试(一)测试目标
  9. 蛋白序列 | 基于深度学习的蛋白质序列家族分类
  10. html字重怎么设置,CSS 字重 font-weight