二分法(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,一经查实,立即删除!

相关文章

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

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

Ubuntu NFS搭建过程

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

教你如何写框架------用中文构建脚本

框架下载地址&#xff1a; http://files.cnblogs.com/zhangfei/Automation.rar 在看此篇博文前请先理清如下两下博文, 该博文是建立在如下两篇文章的基础上的&#xff1a; http://www.cnblogs.com/zhangfei/p/3456159.htmlhttp://www.cnblogs.com/zhangfei/archive/2012/10/10/…

spring之:XmlWebApplicationContext作为Spring Web应用的IoC容器,实例化和加载Bean的过程...

它既是 DispatcherServlet 的 (WebApplicationContext)默认策略&#xff0c;又是 ContextLoaderListener 创建 root WebApplicationContext(根容器&#xff0c;同时也是 DispatcherServlet 的 WebApplicationContext 的父容器)的默认策略。 继承体系 一、XmlWebApplicationCont…

C++17代码整洁之道

C17代码整洁之道 C代码整洁的基本规范 良好的命名 名称应该自解释使用域中的名称避免使用匈牙利命名法(即名称前加类型)不要通过注释禁用代码 函数 只做一件事情 函数体量要小 当你为函数找到一个富有表现力的名称时,名称中没有连词 圈复杂度低 函数的参数要少 函数尽…

使用.NET Remoting开发分布式应用——基于租约的生存期(转载)

使用.NET Remoting开发分布式应用——基于租约的生存期一&#xff0e;概述知名类型的SingleCall对象可以在客户程序的方法调用之后被垃圾收集器清理掉&#xff0c;因为它没有保持状态&#xff0c;属于无状态的。而客户激活的类型的对象和知名类型的SingleTon对象都属于生存期长…

配置 Sybase数据源

1.Start-- > All Programs -- > Sybase - -> Connectivity --> click ‘Open Client Directory Service Editor’ 2.在Server窗口右击鼠标 Right Click -- > select ‘Add’ item 3 弹出’Input Server Name’窗口,输入Server name(服务器名称) ServerName: DM…

C++虚函数表

虚函数 对C 了解的人都应该知道虚函数&#xff08;Virtual Function&#xff09;是通过一张虚函数表&#xff08;Virtual Table&#xff09;来实现的。简称为V-Table。在这个表中&#xff0c;主是要一个类的虚函数的地址表&#xff0c;这张表解决了继承、覆盖的问题&#xff0…