2023-01-30
创始人
2024-05-20 18:01:36
0

69. x的平方根
题目链接点我!!!
本质上还是二分查找,有两种情况

  1. 有整数平方根的,比如16的平方根为4
  2. 没有整数平方根的,比如8的平方根为2.82

对于情况1,相当于用二分查找在序列:1,2,3,…,16的中找4,是可以找到的。
对于情况2,相当于用二分查找在序列:1,2,3,…,8中找按升序插入“2.82”的位置,这也是为什么最后返回的是left-1,而不是left。(要在一个非递减序列中插入一个值,使序列保持非递减,该值的插入位置是left),因为二分查找结束后,left指向“3”,而返回值因该是“2.82”的整数部分即“2”。

class Solution {
public:int mySqrt(int x) {int left = 0, right = x/2;//设置左右边界,right可以设为x,这里设为x/2可以更快一些。if (x == 1 || x == 0)//特殊情况处理,可以不写。return x;        while (left <= right) {long mid = left + (right - left)/2;//防止溢出,(left+right)/2,这种写法,对于一种极端情况,如:right很大,left = right-1,那么left+right就会溢出,这里mid为long是因为后边是mid*mid,int会溢出。if (mid * mid > x) right = mid - 1;else if (mid * mid < x)left = mid + 1;elsereturn mid;}return left - 1;}
};

367. 有效的完全平方数
题目链接点我!!!
和上一题相同,分两种情况

  1. 有整数平方根的,比如16的平方根为4
  2. 没有整数平方根的,比如8的平方根为2.82

对于情况1,可以从序列1,2,3,…,16中找到16的平方根4。即返回true。
对于情况2,则无法从序列1,2,3,…,8中找到2.82。即返回false。

class Solution {
public:bool isPerfectSquare(int num) {int left = 0, right = num/2;if (num == 1)return true;while (left <= right) {long mid = left + (right - left) / 2;if (mid * mid > num)right = mid - 1;else if (mid * mid < num)left = mid + 1;elsereturn true;}return false;}
};

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...