二分法(leetcode分类解题,C++代码详细注释)

二分法

  • 前言
  • 69. x 的平方根
  • 35. 搜索插入位置

前言

二分查找也常被称为二分法或者折半查找,每次查找时通过将待查找区间分成两部分并只取一部分继续查找,将查找的复杂度大大减少。对于一个长度为 O(n) 的数组,二分查找的时间复杂度为 O(log n)。

69. x 的平方根

在这里插入图片描述
题解
我们可以把这道题想象成,给定一个非负整数 aaa,求f(x)=x2,a=0f (x) = x2,a = 0f(x)=x2,a=0 的解。因为我们只考虑 x≥0x ≥ 0x0,所以 f(x)f (x)f(x) 在定义域上是单调递增的。考虑到 f(0)=a≤0,f(a)=a2a≥0f (0) = a ≤ 0, f (a) = a2 a ≥ 0f(0)=a0f(a)=a2a0,我们可以对 [0,a][0, a][0,a] 区间使用二分法找到 f(x)=0f (x) = 0f(x)=0 的解。

代码

class Solution {
public:int mySqrt(int x) {if(x == 1)return 1;int min = 0;int max = x;while(max-min>1){int m = (max+min)/2;if(x/m<m)max = m;elsemin = m;}return min;}
};

35. 搜索插入位置

在这里插入图片描述

题解
例如到底是 while(left<right)while(left < right)while(left<right) 还是 while(left<=right)while(left <= right)while(left<=right),到底是right=middleright = middleright=middle呢,还是要right=middle−1right = middle- 1right=middle1呢?

这里弄不清楚主要是因为**「对区间的定义没有想清楚,这就是不变量」**。

要在二分查找的过程中,保持不变量,这也就是**「循环不变量」**。

代码

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int n = nums.size();int left = 0;int right = n - 1; // 定义target在左闭右闭的区间里,[left, right] while (left <= right) { // 当left==right,区间[left, right]依然有效int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2if (nums[middle] > target) {right = middle - 1; // target 在左区间,所以[left, middle - 1]} else if (nums[middle] < target) {left = middle + 1; // target 在右区间,所以[middle + 1, right]} else { // nums[middle] == targetreturn middle;}}// 分别处理如下四种情况// 目标值在数组所有元素之前  [0, -1]// 目标值等于数组中某一个元素  return middle;// 目标值插入数组中的位置 [left, right],return  right + 1// 目标值在数组所有元素之后的情况 [left, right], return right + 1return right + 1;}
};

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

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

相关文章

kernel module required key not available

UEFI主板中禁用Secure Boot转载于:https://www.cnblogs.com/jhaohai/p/3489818.html

我自横刀向天笑,我命由我不由天

那么豪放不羁,慷慨如歌.虽然江湖再来,翠山远逝,肝胆乾坤有去留, 可人生至此,交友如斯,生复何恨,死有何悲呢?我一直在想&#xff0c;“向天笑”的这个笑是怎样的笑&#xff0c;怎样的心情&#xff1f;不有行者&#xff0c;无以图将来&#xff1b;不有死者&#xff0c;无以酬圣猪…

UNIX网络编程学习笔记(代码超详细解析)(持续更新)

1. 其他函数准备 1. TCP 回射服务器程序&#xff1a; str_echo 函数 #include “unp.h”void str_echo(int sockfd) {ssize_t n;char buf[MAXLINE];again:/*write() 函数定义&#xff1a;ssize_t write (int fd, const void * buf, size_t count); 函数说明&#xff1a;w…

oracle数据库中函数和存储过程中的区别

一、函数必须有返回值&#xff0c;过程没有返回值&#xff1b; 二、函数可以单独执行&#xff0c;过程必须通过execute执行&#xff1b; 三、函数可以嵌入SQL中执行&#xff0c;过程不能。 可以将比较复杂的查询写成函数&#xff0c;然后在过程中调用。转载于:https://www.cnbl…

百川2大模型微调问题解决

之前用https://github.com/FlagAlpha/Llama2-Chinese微调过几个模型&#xff0c;总体来说llama2的生态还是比较好的&#xff0c;过程很顺利。微调百川2就没那么顺利了&#xff0c;所以简单做个记录 1. 数据准备&#xff0c;我的数据是单轮对话&#xff0c;之前微调llama2已经按…

Aspx页面javascript的几个trick

1、一般而言&#xff0c;如果想给aspx页面上的web form control加上一些javascript的特性&#xff0c;可以用Attributes.Add来实现。例如&#xff0c;对TextBox txt&#xff0c;可以&#xff1a;txt.Attributes.Add("onclick", "fcn0();");那么&#xff0c…

ArcGIS 10——地理数据库管理GIS数据

写本文的最初意向是当前正在进行的项目中有实现ESRI版本化数据管理的功能模块&#xff0c;碰到一些棘手的问题&#xff0c;几经周折还是决定系统学习ArcGIS10的帮助文档。&#xff08;文章摘抄的比较多&#xff09; 地理数据库是用于保存数据集集合的“容器”。首先了解一下Arc…

阿特拉斯神(一)

Atlas出来很久了&#xff0c;因为用不上&#xff0c;所以没有学习过&#xff0c;今天准备学了&#xff0c;却发现资料虽不少&#xff0c;但是觉得有点乱&#xff0c;还是自己从英文资料循序渐进学吧。说真的没有扎实学过什么&#xff0c;那么就从Atlas开始吧&#xff0c;希望也…

Qt学习笔记(持续更新)

第一个应用程序 #include "widget.h" #include <QApplication> #include<QLabel> int main(int argc, char *argv[]) {//创建qt应用程序对象QApplication a(argc, argv);//创建标签控件QLabel label("你好");//来吧&#xff0c;展示label.sho…

文本框宽度自动适应文本宽度

<html> <head> <title>文本框宽度自动适应文本宽度 </title> </head> <script type"text/javascript"> function changeInputlength(cursor) { var getTextdocument.getElementById("text"); cursor.sizegetText.valu…

安装了一次Linux,哈哈

昨天在宿舍里&#xff0c;舍友在她的机子上装了Redhat&#xff0c;自己在旁边和另一舍友做参谋&#xff0c;哈哈&#xff0c;虽然中间几多挫折&#xff0c;但最终还是把系统装好了&#xff0c;第一次完整的安装Linux&#xff0c;在此记录一下&#xff0c;哈哈…… 现在想…

Ubuntu NFS搭建过程

简介 NFS:是Network FileSystem。最大的作用就是通过网络&#xff0c;让不同的机器、不同的作业系统、可以分享档案。通过将共享目录挂接到本地&#xff0c;就可以像操作本地目录一样去操作共享的目录。在共享中分为服务器和客户端,需要安装的程序也不一样&#xff0c;客户端通…

Unicode简介【转】

Unicode是一种字符编码规范 。先从ASCII说起。ASCII是用来表示英文字符的一种编码规范&#xff0c;每个ASCII字符占用1个字节&#xff08;8bits&#xff09; 因此&#xff0c;ASCII编码可以表示的最大字符数是256&#xff0c;其实英文字符并没有那么多&#xff0c;一般只用前12…