清晰理解并解决二分问题

news2024/11/15 16:45:28

文章目录

  • 二分问题常规解法:
  • 使用C++STL自带算法解决二分问题:
  • 小数二分

二分问题常规解法:

二分问题注意事项:

  • 题目可能无解,但二分一定有解(也就是二分问题会得到一个结果,但是该结果可能不符合题目要求)

  • 有单调性的一定可以二分,可以二分的题目不一定有单调性,二分和单调性无关

  • 二分的本质是边界:找到一个性质可以把区间一分为二

视频推荐(强烈推荐看一遍):二分查找为什么总是写错?_哔哩哔哩_bilibili

二分模板:

int left = -1, right = nums.size();
int mid = 0;
while (left + 1 != right)
{
	mid = (left + right) / 2;
	if (IsBlue(mid)) left = m; //IsBlue表示mid是否满足蓝色区间的性质
	else r = m;
}
if (left != -1)         //如果不存在满足蓝色区间的数值
{

}
if (right != nums.size())//如果不存在满足红色区间的数值
{
    
}

使用思路如下:

  • 建模:划分蓝红区域,确定IsBlue()—左半边的性质
  • 确定最后使用的是left还是right
  • 套用算法模板

m始终处于[0,N)

mid=(left+right)/2

知道left的最小值是-1,right的最小值是1(如果是0,则不满足left+1!=right则不会进入循环),所以mid最小是0

知道right的最大值是N,left的最大值是N-2(N-1的话就不满足left+1!=right则不会进入循环),所以mid最大值是N-1

例题练习:

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

在这里插入图片描述

解法:

class Solution {
public:
	vector<int> searchRange(vector<int>& nums, int target)
	{
		vector<int> res;
		int begin = -1, end = -1;//一连串目标值的第一个目标值,例如target = 3,3 3 3 begin是第一个3的下标,end是最后一个3的下标
		int left = -1, right = nums.size();
		int mid = 0;
		while (left + 1 != right)
		{
			mid = (left + right) / 2;
			if (nums[mid] < target) left = mid;
			else right = mid;
		}
		if (right != nums.size() && nums[right] == target)//如果存在右边的区间且right等于目标值,则right是begin
		{
			begin = right;
		}
		else//说明区间不存在目标值
		{
			res.push_back(begin);
			res.push_back(end);
			return res;
		}
		left = -1, right = nums.size();
		mid = 0;
		while (left + 1 != right)
		{
			mid = (left + right) / 2;
			if (nums[mid] <= target) left = mid;
			else right = mid;
		}
		end = left;
		res.push_back(begin);
		res.push_back(end);
		return res;
	}
};

使用C++STL自带算法解决二分问题:

std::lower_bound()返回大于等于value值的第一个元素的迭代器

std::upper_bound()返回大于等于value值的最后一个元素的迭代器

使用STL算法解决上述问题

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

在这里插入图片描述

class Solution 
{
public:
    vector<int> searchRange(vector<int>& nums, int target) 
    {
        vector<int> ans = {-1, -1};
        //查找第一个大于或等于target的元素的迭代器
        auto it_begin = lower_bound(nums.begin(), nums.end(), target);
        //如果找到且等于target
        if(it_begin != nums.end() && *it_begin == target)
            ans[0] = it_begin - nums.begin();
        //查找第一个大于target的元素的迭代器
        auto it_end = upper_bound(nums.begin(), nums.end(), target);
        //当nums只有一个元素时且大于或等于target时,it_end肯定会指向nums.end()
        //小于时,nums.begin() == it_end,此时返回-1
        if(it_end != nums.begin() && *(it_end - 1) == target)
            ans[1] = it_end - nums.begin() - 1;
        return ans;
    }
};

小数二分

小数二分是和整数二分区别是精度,小数二分需要通过精度来判断是否退出循环

790. 数的三次方根 - AcWing题库

#include<iostream>
#include<iomanip>

using namespace std;


double searchnumber(double n)
{
    bool isre = false;
    if (n < 0)
    {
        n = -n;
        isre = true;
    }
    double l = 0, r = 0;
    if (n < 1)
        r = 1;
    else
        r = n;
    double mid = 0;
    while (r - l > 1e-8)
    {
        mid = (l + r) / 2;
        if ((mid * mid * mid) >= n) r = mid;
        else l = mid;
    }
    if (!isre)
        return mid;
    else
        return -mid;
}

int main()
{
    double n = 0;
    cin >> n;
    cout << fixed<<setprecision(6)<<searchnumber(n) << endl;//sixed<<setprecision(6)控制输出几位小数

    return 0;
}

这里面1e-8为精度,数值越小最后得到的三次方根越准确

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

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

相关文章

RabbitMQ-集群

一、搭建1、创建三个虚拟机2、修改三台主机的hostname,分别为node1,node2,node3,分别重启vi /etc/hostname reboot3、配置各个主机的hosts文件&#xff0c;让各个节点都能互相识别对方vi /etc/hosts #添加下面配置 192.168.xxx.165 node1 192.168.xxx.167 node2 192.168.xxx.16…

Django by Example·第三章|Extending Your Blog Application@笔记

Django by Example第三章|Extending Your Blog Application笔记 之前已经写过两章内容了&#xff0c;继续第三章。第三章继续对博客系统的功能进行拓展&#xff0c;其中将会穿插一些重要的技术要点。 部分内容引用自原书&#xff0c;如果大家对这本书感兴趣 请支持原版Django …

基于模块联邦的微前端实现方案

一、 微前端应用案例概述 当前案例中包含三个微应用&#xff0c;分别为 Marketing、Authentication 和 Dashboard Marketing&#xff1a;营销微应用&#xff0c;包含首页组件和价格组件 Authentication&#xff1a;身份验证微应用&#xff0c;包含登录组件 Dashboard&#x…

B站发帖软件哪个好用?好用的哔哩哔哩发帖工具

B站发帖软件哪个好用?好用的哔哩哔哩发帖工具#发帖软件#哔哩哔哩发帖#视频发布软件 登录成功之后&#xff0c;进入到这样一个界面&#xff0c;默认情况下是这个样子的&#xff0c;我们在这里输入一下我们的一个文件夹的路径&#xff0c;输入到这里&#xff0c;点击添加账号&a…

kettle开发-Day36-循环驱动作业

前言&#xff1a;在日常数据处理时&#xff0c;我们通过变量传参来完成某个日期的数据转换。但可能因程序或者网络原因导致某个时间段的数据抽取失败。常见导致kettle作业失败的原因大概分为三大类&#xff0c;数据源异常、数据库异常、程序异常。因此面对这些异常时&#xff0…

Not available OpenAI s services are not available in your country.

一、准备阶段 1、邮箱账号(qq、网易、谷歌等等) 2、你能够科学上网(下边详细介绍) 3、拥有一个GW手机号&#xff0c;用于接收注册验证码。&#xff08;下边详细介绍&#xff09; 二、开始注册 1、官方注册网址https://beta.openai.com/signup&#xff08;按照步骤注册&am…

RDSDRDSPolarDBPolarDB-X的区别

RDS 阿里云关系型数据库&#xff08;Relational Database Service&#xff0c;简称RDS&#xff09;&#xff0c;是一种稳定可靠、可弹性伸缩的在线数据库服务。 基于阿里云分布式文件系统和高性能存储&#xff0c;RDS支持MySQL、SQL Server、PostgreSQL和PPAS&#xff08;Post…

在VScode终端上创建nuxtjs项目遇到的问题以及使用GitHub遇到的问题和一些个人笔记

文章目录&#x1f4cb;前言&#x1f4bb;关于GitHub打开慢或无法打开的问题&#x1f4bb;克隆GitHub的项目到本地&#x1f4bb;创建nuxtjs项目&#x1f9e9;无法加载文件的报错问题&#x1f9e9;使用vue init nuxt/starter demo出现的问题&#x1f9e9;另一种命令创建nuxtjs项目…

字符编码及转换

什么是字符编码字符编码&#xff08;Character encoding&#xff09;也称字集码&#xff0c;是把字符集中的字符&#xff0c;编码为指定集合中的某一对象&#xff08;例如&#xff1a;比特模式、自然数序列、8位组或者电脉冲&#xff09;&#xff0c;以便文本在计算机中存储或者…

前端控制台出现 红色 的报错信息TypeError: fn.apply is not a function

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 使用vue在原来的系统中 开发新的模块&#xff0c;开发时无意间发现 前端控制台出现 红色 的报错信息&#xff0c;但是页面依然还是正常 加载出来了 控制台一直报错 TypeError: fn.apply is not a fun…

09- 逻辑回归算法 (LogisticRegression) (机器学习)

基本概念: 逻辑回归主要逻辑是通过sigmoid函数进行分类, 当函数结果大于0时赋值1, 小于0时赋值0, 然后根据结果进行分类, 化简后求最小值的过程和线性方程类似, 该函数的特点是:分类算法 模型训练 : lr LogisticRegression() from sklearn.linear_model import LogisticRegr…

力扣39.组合总数

文章目录力扣39.组合总数题目描述方法1&#xff1a;深搜回溯力扣39.组合总数 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可…

【数据库】MySQL 单表查询,多表查询

目录 单表查询 一&#xff0c;创建表worker 1&#xff0c;创建表worker的sql代码如下&#xff1a; 2&#xff0c;向worker表中插入信息 二&#xff0c; 按要求进行单表查询 1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 …

【自学Python】Python字符大小写判断

大纲 Python字符串是否是小写 Python字符串是否是小写教程 在开发过程中&#xff0c;有时候我们需要判断一个 字符串 是否是小写形式&#xff08;即&#xff0c;所有的字符都是小写字母&#xff0c;不是英文字符的忽略不做判断&#xff09;&#xff0c;在 Python 中&#xff…

SAP ERP系统SD模块常用增强之一:VA01/VA02创建或修改SO的输入检查

在SAP/ERP项目的实施中销售管理模块&#xff08;SD&#xff09;的创建和修改销售订单必定会有输入字段校验检查的需求&#xff0c;来防止业务人员录入错误或少录入数据&#xff0c;SAP公司也考虑到这一点&#xff0c;所以这方面的配置功能也非常强大&#xff0c;通常情况下不需…

GraphQL vs REST API 架构,谁更胜一筹?

GraphQL vs REST API 架构&#xff0c;谁更胜一筹&#xff1f; Michele Moody 平川 万佳 2020 年 1 月 18 日 本文字数&#xff1a;2890 字 阅读完需&#xff1a;约 9 分钟 2015 年&#xff0c;Facebook 开源 GraphQL。此后&#xff0c;它在前端 Web 中大受欢迎。传统的 R…

一篇文章带你学会Ansible的安装及部署

目录 前言 一、什么是Ansible 二、Ansible的工作方式 三、Ansible的安装 四、构建Anisble清单 1、清单书写方式 2、清单查看 3、清单书写规则 4、主机规格的范围化操作 五、ansible命令指定清单的正则表达式 六、 Ansible配置文件参数详解 1、配置文件的分类与优先…

【C++】C/C++内存管理模板初阶

文章目录一、 C/C内存管理1. C/C内存分布2. C内存管理方式3. operator new与operator delete函数4. new和delete的实现原理5. 定位new表达式6. 常见面试题malloc/free和new/delete的区别内存泄漏二、模板初阶1. 泛型编程2. 函数模板3. 类模板一、 C/C内存管理 1. C/C内存分布 …

每天10个前端小知识 【Day 13】

前端面试基础知识题 1. Position&#xff1a;absolute绝对定位&#xff0c;是相对于谁的定位&#xff1f; CSS position属性用于指定一个元素在文档中的定位方式。top&#xff0c;right&#xff0c;bottom 和 left 属性则决定了该元素的最终位置。 absolute的元素会被移出正…

牛客网 NC107 寻找峰值

前言&#xff1a;内容包括四大模块&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读 题目&#xff1a; 描述 给定一个长度为n的数组nums&#xff0c;请你找到峰值并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回…