1.1.3 数组——x的平方(Leetcode 69)
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
解法三:牛顿迭代法
- 将题目转化成求解函数零点
- 牛顿迭代法的本质是借助泰勒级数,从初始值开始快速向零点逼近。
- 实现过程
- 实现细节
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)相关推荐
- 【分治】LeetCode 69. Sqrt(x)
LeetCode 69. Sqrt(x) 参考网址:http://www.cnblogs.com/grandyang/p/4346413.html Solution1: class Solution ...
- LeetCode #69 x的平方根 二分查找
LeetCode #69 x的平方根 题目描述 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍 ...
- LeetCode 69. x 的平方根:二分查找法实现自定义的函数:x 的平方根
LeetCode 69. x 的平方根:二分查找法实现自定义的函数:x 的平方根 题目描述 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型 ...
- 二维数组删除_「leetcode」数组:总结篇!(一文搞懂数组题目)
数组理论基础 数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力 也就是说,想法很简单,但实现起来 可能就不是那么回事了. 首先要知道数组在内存中的存储方 ...
- 用数组建立二叉树(LeetCode二叉树测试)
我在做leetcode上的二叉树题目,经常会报错,但是又不知道错在哪里,于是我想到在vscode上调试我写的代码,于是我参考了leetcode 二叉树的建立.释放内存.层序遍历输出,C++ 做了简化, ...
- c语言数组求逆序对,LeetCode 面试题51. 数组中的逆序对
面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ 题目 在数组中的两个数字,如果 ...
- 【数据结构】树状数组详解(Leetcode.315)
前言 最近做题时遇到一个关于树状数组的题力扣https://leetcode-cn.com/problems/count-of-smaller-numbers-after-self/但是CSDN上仅有 ...
- Acwing语法基础课第八次课(1)751. 数组的左方区域最小数和它的位置741. 斐波那契数列740. 数组变换753. 平方矩阵 I
751. 数组的左方区域 题目 提交记录 讨论 题解 视频讲解 输入一个二维数组 M[12][12],根据输入的要求,求出二维数组的左方区域元素的平均值或元素的和. 数组的两条对角线将数组分为了上下左 ...
- L350 两个数组的交集 ii leetcode
1. 一个错误的思路:用小的那个数组,逐个扫描大的数组,如果存在,就加入新Arraylist.但是,这个算法有个很严重的问题,没有考虑次数 比如: {3,1,2} {1,1} 这样输出的是{1,1}, ...
最新文章
- 一份忧伤的大厂生存百科
- 通用窗口类 Inventory Pro 2.1.2 Demo1(下)
- UGUI的优点新UI系统四 开源
- git遇到的一些问题
- Apache下PHP的几种工作方式
- Entity Framework 基础
- linux核能软件,ARM big.LITTLE大小核架构在Linux和Android内核下多核调度算法
- python将2个列表list合并到1个列表使用appenden_【新手入门】20个很实用的 Python 学习小技巧...
- AT91SAM9260EK-38k产生原理
- 想当年,我也是斩获20+大厂offer的收割机!
- 1007 素数对猜想(C语言)
- delphi 如何知道 Treeview,Listview 当前最上面显示的节点
- Python 学习笔记 (6)—— 读写文件
- iptables详解(2):iptables管理
- 宋代词人前十名都有谁?第一名更是震铄古今最全能的大文豪
- C语言汉字在内存中如何存储
- 领接矩阵结构的图的遍历(广度和深度遍历)
- 【洛谷】P1894 完美的牛栏
- mysql远程备份_mysql实现自动远程备份一办法
- Win10环境下安装TensorFlow 2.0简明教程
热门文章
- 4、基本命令-系统管理
- imx6q ssi1 配置成CPU为主,codec PCM从模式 SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_CBS_CFS
- 农夫住房抵押贷款叫醒农村沉睡资本
- 2011.4.5 凌晨 3:50分
- 《七堂极简物理课》总结
- ROM,PROM,EPROM,EEPROM及FLASH存储器的区别
- 论文中英文摘要、目录、每章的页眉不同,页脚处的页码自动连续设置方法
- MBT测试实例:做个“机器人”,使其随机、持续的对“web页面”做交互性测试(一)测试目标
- 蛋白序列 | 基于深度学习的蛋白质序列家族分类
- html字重怎么设置,CSS 字重 font-weight