【python|二分|leetcode441】一题搞清楚二分区间问题---闭区间、左闭右开、左开右闭、全开区间

every blog every motto: Although the world is full of suffering, it is full also of the overcoming of it

0. 前言

一题搞清楚二分区间问题—闭区间、左闭右开、左开右闭、全开区间

0.1 题目:Problem: 441. 排列硬币

你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。

在这里插入图片描述


计算m行对应的硬币数,由于是等差数列, ( 首项 + 尾项) ∗ 项数 / 2 (首项+尾项)*项数/2 (首项+尾项)项数/2 ,即:
( 1 + m ) ∗ m / 2 (1+m)∗m/2 (1+m)m/2

总硬币数为n,所以我们需要比较两个的大小,即,满足

( 1 + m ) ∗ m / 2 < = n (1+m)∗m/2<=n (1+m)m/2<=n

变换后:

( 1 + m ) ∗ m < = 2 ∗ n (1+m)∗m<=2∗n (1+m)m<=2n

即通过二分法不断尝试m的可能取值。

敲重点:

while 循环条件决定是闭区间还是开区间
while 循环条件决定是闭区间还是开区间
while 循环条件决定是闭区间还是开区间


1 闭区间

闭区间,m是向上取整还是向下取整都可以,

由于是闭区间,m对应的值是可以取到的
由于是闭区间,m对应的值是可以取到的
由于是闭区间,m对应的值是可以取到的

所以,不管left 还是right的更新,都需要在m的基础上加一或是减一

举个例子:当区间为【2,2】,不满足条件时,需要更新left或right,如果此时left = m,那么就陷入了死循环;right同理。

class Solution:def arrangeCoins(self, n: int) -> int:l, r = 1, n while l <= r: # 闭区间m = (l + r )//2 #·‌向下取整,eg:·‌(3+4)//2·‌=>·‌3# m = (l + r +1)//2 if m * (m+1) <= 2*n:l = m + 1else:r = m - 1# m = (l + r + 1)//2 # 向上取整,eg (3+4+1)//2 => 4return l - 1

2 左闭右开【)

常规的默认写法是 m = (l+r)//2,这里蕴含着向下取整在里面,所以这个对应的是左闭右开。

故,当更新时,l = m+ 1 (若,当区间为【3,4】,m = (3+4)//2 = 3,l = m = 3,区间没有变化,死循环);

而 r= m ,

class Solution:def arrangeCoins(self, n: int) -> int:l, r = 1, n while l < r: # 左闭右开区间 [)m = (l + r )//2 # 向下取整,eg: (3+4)//2 => 3if m * (m+1) <= 2*n:l = m + 1else:r = m return l - 1 if n != 1 else 1

3 左开右闭(】

由于m是向上取整,取右区间对应的值,eg: 区间为[3,4],m = (3+4+1)//2 = 4,

右区间是取到的,所以当更新时:r = m - 1 (如果r = m,即r = 4,区间没有变化,死循环);

而左区间取不到,所以 l = m

class Solution:def arrangeCoins(self, n: int) -> int:l, r = 1, n while l < r: # 向上取整,不加1是向下取整# 左开右闭区间 (]m = (l + r +1 )//2 # 向上取整,eg (3+4+1)//2 => 4if m * (m+1) <= 2*n:l = m else:r = m - 1return l 

4 全开区间

  1. 全开区间的默认条件写法是: l +1 < r
  2. 初始条件是两个不满足条件的值:l, r = 0, n + 1
  3. 由于是开区间,m,向下还是向上取整都是可以的,和闭区间类似
  4. 由于是left和right的更新 l = m 或r = m`
class Solution:def arrangeCoins(self, n: int) -> int:l, r = 0, n + 1 # 注意初始值while l + 1 < r: # 全开区间 ()m = (l + r )//2# m = (l + r +1)//2if m * (m+1) <= 2*n:l = melse:r = m return l# m = (l + r + 1)//2

5 总结

5.1 开区间还是闭区间,有while条件决定

* <=是闭区间
* < 开区间,具体哪种由mid的取值决定* m = (left + right)//2,向下取整,所以left能够取到,左闭右开 `[)`* m = (left + right + 1)//2, 向上取整,right能够取到,左开右闭 `(]`

5.2 left 和right的更新

* 当闭区间【】时,left = m + 1; right = m - 1
* 当全开区间()时,left = m ; right = m
* 当左闭右开【)时,left = m + 1; right = m
* 当左开右闭(】时,lefet = m; right = m - 1

5.3 m值的计算

5.3.1 闭区间

向上向下取整都可以

m = (l + r +1)//2
m = (l + r )//2

5.3.2 左闭右开【)

m = (l + r )//2 # 向下取整,eg: (3+4)//2 => 3

5.3.3 左开右闭(】

m = (l + r + 1)//2 # 向下取整,eg: (3+4+1)//2 => 4

5.3.4 全开区间()

都可以,同闭区间

m = (l + r +1)//2
m = (l + r )//2

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

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

相关文章

【NLP 34、实践 ⑧ 基于faq知识库和文本匹配算法进行意图识别】

目录 一、demo1_similarity_function.py 二、demo2_bm25.py 三、基于faq知识库和文本匹配算法的意图识别 1.初始化 2.加载BM25模型 3.加载Word2Vec模型 4.文本向量化 5.加载知识库 6.查询方法 7.模型测试 正是江南好时节&#xff0c;落花时节又逢君 —— 25.3.7 一、demo1_sim…

机器人交互系统 部署构建

环境要求 Ubuntu 20.04 或更高版本ROS Noetic 或兼容版本Python 3.8 安装步骤 1. 安装ROS环境&#xff08;如未安装&#xff09; sudo apt update sudo apt install ros-noetic-desktop-full source /opt/ros/noetic/setup.bash2. 创建工作空间并克隆代码 mkdir -p ~/code…

每日一题——两数相加

两数相加 问题描述问题分析解题思路代码实现代码解析注意事项示例运行总结 问题描述 给定两个非空链表&#xff0c;表示两个非负整数。链表中的每个节点存储一个数字&#xff0c;数字的存储顺序为逆序&#xff08;即个位在链表头部&#xff09;。要求将这两个数字相加&#xff…

ResNet50深度解析:原理、结构与PyTorch实现

ResNet50深度解析&#xff1a;原理、结构与PyTorch实现 1. 引言 ResNet&#xff08;残差网络&#xff09;是深度学习领域的一项重大突破&#xff0c;它巧妙解决了深层神经网络训练中的梯度消失/爆炸问题&#xff0c;使得构建和训练更深的网络成为可能。作为计算机视觉领域的里…

政安晨【零基础玩转各类开源AI项目】Wan 2.1 本地部署,基于ComfyUI运行,最强文生视频 图生视频,一键生成高质量影片

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 下载项目 创建虚拟环境 安装项目依赖 尝试运行 依次下载模型 完成 我们今天要使…

每日一题----------String 和StringBuffer和StringBuiler重点

本质&#xff1a;是一个char字符数组存储字符串 总结&#xff1a; 1.如果字符串存在大量的修改操作&#xff0c;一般使用StringBuffer或者StringBuilder。 2.如果字符串存在大量的修改操作&#xff0c;并且单线程的情况&#xff0c;使用StringBuilder。 3.如果字符串存在大…

35.HarmonyOS NEXT Layout布局组件系统详解(二):AutoRow行组件实现原理

HarmonyOS NEXT Layout布局组件系统详解&#xff08;二&#xff09;&#xff1a;AutoRow行组件实现原理 文章目录 HarmonyOS NEXT Layout布局组件系统详解&#xff08;二&#xff09;&#xff1a;AutoRow行组件实现原理1. AutoRow组件概述2. AutoRow组件接口定义3. AutoRow组件…

Java 集合框架大师课:集合框架源码解剖室(五)

&#x1f525;Java 集合框架大师课&#xff1a;集合框架源码解剖室&#xff08;五&#xff09; &#x1f4a3; 警告&#xff1a;本章包含大量 裸码级硬核分析&#xff0c;建议搭配咖啡因饮料阅读&#xff01;☕️ 第一章 ArrayList 的扩容玄学 1.1 动态扩容核心代码大卸八块 …

Kubernetes服务部署 —— Kafka

1、简介 Kafka和zookeeper是两种典型的有状态的应用集群服务。首先kafka和zookeeper都需要存储盘来保存有状态信息&#xff1b;其次kafka和zookeeper每一个实例都需要有对应的实例Id (Kafka需broker.id, zookeeper需要my.id) 来作为集群内部每个成员的标识&#xff0c;集群内节…

计算机网络基础知识

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

电脑的写字板如何使用?

打开写字板&#xff1a; 直接按一下键盘上的win R 键&#xff0c;然后输入&#xff1a;write &#xff0c; 再按一下回车 , 即可打开写字板 可以在里面写文字 和 插入图片等… &#xff0c; 如下所示&#xff1a; 保存写字板内容&#xff1a; 当我们写好了之后&#xff0c;…

用vector实现栈的功能

要注意pop_back和back()的区别 #include <bits/stdc.h> using namespace std;void Push(vector<int> &v,int x) {v.push_back(x); }void Top(vector<int> &v) {if(!v.empty()){cout<<v.back()<<endl;// v.pop_back();}else {cout<&l…

SegMAN模型详解及代码复现

SegMAN模型概述 模型背景 在深入探讨SegMAN模型之前&#xff0c;我们需要了解其研究背景。在SegMAN出现之前&#xff0c;计算机视觉领域的研究主要集中在以下几个方面&#xff1a; 手工制作方法&#xff0c;如SIFT基于卷积神经网络(CNN)的方法&#xff0c;如STN和PTN对平移、…

基于粒子群算法的配电网重构

一、配电网重构原理 定义&#xff1a; 配电网重构是指在满足运行约束的前提下&#xff0c;通过改变开关状态优化配电网性能&#xff0c;提高系统的经济效益和运行效率。 拓扑约束&#xff1a; 配电网必须保持径向拓扑&#xff0c;避免环网或孤岛。采用算法控制开关状态的选择&…

自然语言处理:无监督朴素贝叶斯模型

介绍 大家好&#xff0c;博主又来和大家分享自然语言处理领域的知识了&#xff0c;今天给大家介绍的是无监督朴素贝叶斯模型。 在自然语言处理这个充满挑战又极具魅力的领域&#xff0c;如何从海量的文本数据中挖掘有价值的信息&#xff0c;一直是研究者们不断探索的课题。无…

软件工程概述

软件开发生命周期 软件定义时期&#xff1a;包括可行性研究和详细需求分析&#xff0c;任务是确定软件开发的总目标。 问题定义可行性研究&#xff08;经济、技术、操作、社会可行性&#xff0c;确定问题和解决办法&#xff09;需求分析&#xff08;确定功能需求&#xff0c;性…

基于51单片机的日历流水灯proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1lt1ubDhKNTeIcP0Kf1UXrA 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C51 是一款常用的 8 位单片机&#xff0c;由 Atmel 公司&#xff08;现已被 Microchip 收…

【Go沉思录】朝花夕拾:探究 Go 接口型函数

本文目录 序1.接口型函数案例方式1 GetterFunc 类型的函数作为参数方式2 实现了 Getter 接口的结构体作为参数价值 2.net/http包中的使用场景 序 之前写Geecache的时候&#xff0c;遇到了接口型函数&#xff0c;当时没有搞懂&#xff0c;现在重新回过头研究复习Geecache的时候…

【若依框架】代码生成详细教程,15分钟搭建Springboot+Vue3前后端分离项目,基于Mysql8数据库和Redis5,管理后台前端基于Vue3和Element Plus,开发小程序数据后台

今天我们来借助若依来快速的搭建一个基于springboot的Java管理后台&#xff0c;后台网页使用vue3和 Element Plus来快速搭建。这里我们可以借助若依自动生成Java和vue3代码&#xff0c;这就是若依的强大之处&#xff0c;即便你不会Java和vue开发&#xff0c;只要跟着石头哥也可…

Java 线程与线程池类/接口继承谱系图+核心方法详解

Java 线程与线程池类/接口继承谱系图 1. 线程相关类与接口关系 #mermaid-svg-shTOx2cIkm79Zevf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-shTOx2cIkm79Zevf .error-icon{fill:#552222;}#mermaid-svg-shTOx2cI…