当前位置: 首页 > news >正文

C++二分查找算法的应用:长度递增组的最大数目

本文涉及的基础知识点

二分查找

题目

给你一个下标从 0 开始、长度为 n 的数组 usageLimits 。
你的任务是使用从 0 到 n - 1 的数字创建若干组,并确保每个数字 i 在 所有组 中使用的次数总共不超过 usageLimits[i] 次。此外,还必须满足以下条件:
每个组必须由 不同 的数字组成,也就是说,单个组内不能存在重复的数字。
每个组(除了第一个)的长度必须 严格大于 前一个组。
在满足所有条件的情况下,以整数形式返回可以创建的最大组数。
示例 1:
输入:usageLimits = [1,2,5]
输出:3
解释:在这个示例中,我们可以使用 0 至多一次,使用 1 至多 2 次,使用 2 至多 5 次。
一种既能满足所有条件,又能创建最多组的方式是:
组 1 包含数字 [2] 。
组 2 包含数字 [1,2] 。
组 3 包含数字 [0,1,2] 。
可以证明能够创建的最大组数是 3 。
所以,输出是 3 。
示例 2:
输入:usageLimits = [2,1,2]
输出:2
解释:在这个示例中,我们可以使用 0 至多 2 次,使用 1 至多 1 次,使用 2 至多 2 次。
一种既能满足所有条件,又能创建最多组的方式是:
组 1 包含数字 [0] 。
组 2 包含数字 [1,2] 。
可以证明能够创建的最大组数是 2 。
所以,输出是 2 。
示例 3:
输入:usageLimits = [1,1]
输出:1
解释:在这个示例中,我们可以使用 0 和 1 至多 1 次。
一种既能满足所有条件,又能创建最多组的方式是:
组 1 包含数字 [0] 。
可以证明能够创建的最大组数是 1 。
所以,输出是 1 。
参数范围
1 <= usageLimits.length <= 105
1 <= usageLimits[i] <= 109

分析

知识点

假定最长组数为len,则各组长度一定是1,2…len。假定各组长度不是连续的,缺少x,那么将(x…) 都扔掉一个元素,变成[x,…)。持续这个过程至到各组长度连续为至。
只关心各值的数量,不关心值,比如:1,2,3和2,1,3完全相同。故可对数据进行排序。

二分

如果如果能创建n组,则一定能创建n-1组。随着len增加,一定会由能创建变成不能创建。寻找最后一个能创建的len。显然适合用左闭右开的二分。

判断能否创建len组

预处理

目标数组为{1,2…len},源数组为升序排序后的 usageLimits,长度不足则在前面补0。比如:目标数组{1,2,3},源数组{0,3,3};目标数组{0,1,2,3},{1,1,2,2}。

推理

我们用len数组表示目标数组,len[i]的含义,[0,len[i])都会有此元素。

len[i]==usageLimits[i]刚好
len[i] > usageLimits[i]不足,需要补缺
len[i] < usageLimits[i]多余,可以用于补缺

长度为3

由于组内不能有重复元素,所以超过len个元素是无效的。我们用表格分析,那些情况刚好创建3组,没多余的数字。

1,1,1,1,1,1可以1填2和3的空缺
1,1,1,1,2可以1填2和3的空缺
1,1,2,2可以1填3的空缺
2,2,2可以2填3的空缺
1,1,1,3可以1填2的空缺
1,2,3可以不用填空缺
3,3不可以1的空缺无法填

猜测

3可以填4及以上缺,如:1333,{2},{3,4},{2,3,4},{1,2,3,4}

如何补缺

假定i1<i2,i2无法补i1的缺,因为i2已经用于[0,i2)不能用于[0,i1)中的任何组。
i1可以补i2的缺。i1只由于[0,i1)组,所以补[i2,…)的缺,不会造成同一组有重复数据。

一个数不会补缺两次

假定k = len[i2] -en[i1],则i1多余不会超过k,
usageLimits[i1]-len[i1] >k
==>usageLimits[i1] >len[i1]+k
==>usageLimits[i1] >len[i2]
因为usageLimits[i2]>=usageLimits[i1]
所以:usageLimits[i2]>len2
所以:i2有多余,和有缺矛盾。
i1多余不会超过k,所以补完i2的缺就空了。
==>无需考虑一个数补两个缺

代码

核心代码

class Solution {
public:
int maxIncreasingGroups(vector& usageLimits) {
m_c = usageLimits.size();
m_v = usageLimits;
sort(m_v.begin(), m_v.end());
int left = 1, right = m_c + 1;
while (right - left > 1)
{
const int mid = left + (right - left) / 2;
if (Can(mid))
{
left = mid;
}
else
{
right = mid;
}
}
return left;
}
bool Can(int len)
{
int i = m_c - 1;
long long llNeed = 0;
for (; len > 0; len–,i–)
{
llNeed -= (m_v[i] - len);
if (m_v[i] >= len)
{
llNeed = max(0LL, llNeed);
}
}
for(;i >= 0 ; i–)
{
llNeed -= m_v[i];
}
return llNeed <= 0;
}
int m_c;
vector m_v;
};

测试用例

template
void Assert(const T& t1, const T& t2)
{
assert(t1 == t2);
}

template
void Assert(const vector& v1, const vector& v2)
{
if (v1.size() != v2.size())
{
assert(false);
return;
}
for (int i = 0; i < v1.size(); i++)
{
Assert(v1[i] ,v2[i]);
}
}

int main()
{
Solution slu;
vector usageLimits;
int res = 0;
usageLimits = { 2,2,2 };
res = slu.maxIncreasingGroups(usageLimits);
Assert(res, 3);
usageLimits = { 1,2,5 };
res = slu.maxIncreasingGroups(usageLimits);
Assert(res, 3);
usageLimits = { 2,1,2 };
res = slu.maxIncreasingGroups(usageLimits);
Assert(res, 2);
usageLimits = { 1,1 };
res = slu.maxIncreasingGroups(usageLimits);
Assert(res, 1);

//CConsole::Out(res);

}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

充满正能量得对大家说
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
墨家名称的来源:有所得以墨记之。
算法终将统治宇宙,而我们统治算法。《喜缺全书》

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开

发环境: VS2022 C++17

相关文章:

C++二分查找算法的应用:长度递增组的最大数目

本文涉及的基础知识点 二分查找 题目 给你一个下标从 0 开始、长度为 n 的数组 usageLimits 。 你的任务是使用从 0 到 n - 1 的数字创建若干组&#xff0c;并确保每个数字 i 在 所有组 中使用的次数总共不超过 usageLimits[i] 次。此外&#xff0c;还必须满足以下条件&…...

提示3D标题编辑器仍在运行怎么解决,以及3D标题编辑器怎么使用

在进行视频剪辑时&#xff0c;尤其是剪辑一些带有文字的开场视频&#xff0c;一般都会使用具有立体效果的3D标题&#xff0c;这样制作出来的视频效果不仅好看&#xff0c;还非常的炫酷&#xff0c;但是对于一些刚刚开始接触视频剪辑的小伙伴来说&#xff0c;可能对3D标题还不是…...

1. PPT高效初始化设置

1. PPT高效初始化设置 软件安装&#xff1a;Office 2019 主题和颜色 颜色可以在白天与黑夜切换&#xff0c;护眼 切换成了黑色 撤回次数 撤回次数太少&#xff0c;只有20次怎么办 自动保存 有时忘记保存就突然关闭&#xff0c;很需要一个自动保存功能 图片压缩 图…...

el-cascader级联选择器选中一个全选中问题

问题 只选中一个却把同级全选中 解决 :props中添加label、value、children属性 label、value、children属性值需要和后端返回的集合中的字段名保持一致 后端返回数据&#xff1a;...

Opencascad(C++)-创建自定义坐标系

文章目录 1、前言2、在Opencascad中显示小的坐标系3、在Opencascad中创建自定义的坐标系 1、前言 在Opencascad开发时&#xff0c;在view中可以显示小的坐标系&#xff0c;但是有时我们需要在建模时创建基准坐标系&#xff0c;当然可以作为工件坐标系也可以作为基准坐标系。本…...

MySQL数据库入门到大牛_01_数据库概述

文章目录 1. 为什么要使用数据库2. 数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库与数据库管理系统的关系2.3 常见的数据库管理系统排名(DBMS)2.4 常见的数据库介绍 3. MySQL介绍3.1 概述3.2 MySQL发展史重大事件3.3 关于MySQL 8.03.4 Why choose MySQL?3.5 Oracle v…...

Web - Servlet详解

目录 前言 一 . Servlet简介 1.1 动态资源和静态资源 1.2 Servlet简介 二 . Servlet开发流程 2.1 目标 2.2 开发过程 三 . Servlet注解方式配置 ​编辑 四 . servlet生命周期 4.1 生命周期简介 4.2 生命周期测试 4.3 生命周期总结 五 . servlet继承结构 5.1 ser…...

postgresql 触发器如何生成递增序列号,从1开始,并且每天重置

大家好&#xff0c;我是三叔&#xff0c;许久不见&#xff0c;这期给大家介绍一下笔者在开发中遇到的业务处理&#xff1a;pgsql 创建触发器生成每日递增序列&#xff0c;并且第二天重置&#xff0c;根据不同的用户进行不同的控制。 1.创建生成递增序列的 table 表 -- 创建us…...

“第五十九天”

这是昨天那道题&#xff0c;这个后面自己的处理思路还是差了点&#xff0c;这道题关键感觉就是对进位的处理的&#xff0c;由于进位的存在&#xff0c;所以处理数据的时候只能从最低位开始&#xff0c;我一开始是从高位处理的&#xff0c;而且后面越来越迷&#xff0c;这个点一…...

IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】

Docker官网 Docker官网&#xff1a;https://www.docker.com/ Docker Hub官网&#xff1a;http://hub.docker.com/ 什么是Docker Docker 是一个开源的容器引擎&#xff0c;可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者和系统管理员在笔记本上编…...

【Linux网络编程_TCP/UDP_字节序_套接字 实现: FTP 项目_局域网聊天项目 (已开源) 】.md updata:23/11/03

文章目录 TCP/UDP对比端口号作用字节序字节序转换api套接字 socket实现网络通讯服务端 逻辑思路demo&#xff1a; 满血版双方通讯/残血版多方通讯服务端 demo客户端 demo FTP 项目实现sever demo:client demo: 局域网多方通讯 配合线程实现sever demo:client demo: TCP/UDP对比…...

Leetcode刷题详解——全排列

1. 题目链接&#xff1a;46. 全排列 2. 题目描述&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],…...

JSONP 跨域访问(1), 简介, 原理, 实验, 缺点

JSONP 跨域访问(1), 简介, 原理, 实验, 缺点 一, JSONP 简介 JSONP&#xff08;JSON with Padding&#xff09;是一种非官方跨域数据交互协议。它允许web页面从不同的域名下加载数据。 由于同源策略&#xff0c;web页面通过XMLHttpRequest调用通常只允许访问与其自身相同域名…...

velero备份k8s集群

流程图 velero备份原理 本地 Velero 客户端发送备份指令。Kubernetes 集群内就会创建一个 Backup 对象。BackupController 监测 Backup 对象并开始备份过程。BackupController 会向 API Server 查询相关数据。BackupController 将查询到的数据备份到远端的对象存储。 velero的…...

描述低轨星座的特点和通信挑战,以及它们在5G和B5G中的作用。

文章目录 2章4 章5章&#xff08;没看&#xff09;6章&#xff08;没看&#xff09; 2章 将卫星星座中每个物理链路中可实现的数据速率、传播延迟和多普勒频移与3GPP技术报告中的参数进行分析和比较[3]。 相关配置 面向连接的网络&#xff0c;预先简历链路 卫星和地面终端有…...

Spring Boot实践 --windows环境下 K8s 部署 Docker

第一步&#xff1a;搭建项目并制作合适的jar包 这里我们准备好前面项目 用户管理系统 项目里的jar包。测试功能&#xff0c;定时任务会每过10s打印一次日志&#xff1a; E:\test>java -jar demospringboot-0.0.1-SNAPSHOT.jar2023-11-01 20:24:21.059 INFO 11848 --- [ …...

Linux 将Qt程序打包为AppImage包

前言 在 Linux 环境下&#xff0c;开发完 Qt 程序后&#xff0c;也需要制作为一个安装包或者可执行文件进行分发。这里介绍使用 linuxdeployqt 将 Qt 程序打包为 .AppImage 应用程序&#xff08;类似于 Windows 的绿色免安装软件&#xff09; 环境配置 配置 Qt 环境变量 这…...

修复国产电脑麒麟系统开机出现initramfs 问题

目录预览 一、问题描述二、原因分析三、解决方案四、知识点呀initramfsBusyBox 五、参考链接 一、问题描述 国产麒麟系统出现 initramfs 模式 二、原因分析 一般在拷贝卡顿过程【强制关机】或者电【脑异常断电】的情况下概率性导致系统分区损坏&#xff0c;重启后大概率就会进…...

机器人控制算法—如何使用C++读取pgm格式的栅格地图并转化为ROS地图格式的data?

1.Introduction 近期正在做全局规划局部动态规划的项目&#xff0c;目前遇到的问题是&#xff0c;我们如何利用C处理pgm地图文件。即将地图信息要与像素点结合起来。所以我们需要知道地图读取和处理的底层原理&#xff0c;这样更好地在非ROS平台下移植。 2.Main 如下几条信息…...

牛客项目(五)-使用kafka实现发送系统通知

kafka入门以及与spring整合 Message.java import java.util.Date;public class Message {private int id;private int fromId;private int toId;private String conversationId;private String content;private int status;private Date createTime;public int getId() {retur…...

s2-pro镜像管理:容器健康检查脚本编写与自动化服务恢复方案

s2-pro镜像管理&#xff1a;容器健康检查脚本编写与自动化服务恢复方案 1. 引言 s2-pro作为专业级语音合成模型镜像&#xff0c;在实际业务场景中承担着重要角色。当服务出现异常时&#xff0c;如何快速发现问题并自动恢复成为运维工作的关键。本文将详细介绍如何为s2-pro编写…...

收藏!小白程序员必备:从零入门大模型,抢占职场新风口(含学习资源包)

收藏&#xff01;小白程序员必备&#xff1a;从零入门大模型&#xff0c;抢占职场新风口&#xff08;含学习资源包&#xff09; CB Insights报告显示&#xff0c;AI智能体市场正爆发式增长&#xff0c;2024年融资达38亿美元。市场分为基础设施、通用应用和垂直应用三大板块&…...

【obs studio】从零开始:高效录制屏幕与声音的完整指南

1. 为什么选择OBS Studio录制屏幕与声音&#xff1f; 如果你正在寻找一款免费、开源且功能强大的屏幕录制工具&#xff0c;OBS Studio绝对是你的不二之选。我最初接触这款软件是因为需要录制一些技术教程&#xff0c;试过市面上不少付费软件后&#xff0c;发现OBS Studio不仅完…...

Canvas Quest人像修复与增强实战:老照片修复与画质提升

Canvas Quest人像修复与增强实战&#xff1a;老照片修复与画质提升 1. 老照片修复的痛点与解决方案 翻开家里的老相册&#xff0c;总能看到一些泛黄、破损或模糊的照片。这些承载着珍贵记忆的画面&#xff0c;往往因为年代久远而变得难以辨认。传统的手工修复不仅耗时费力&am…...

编译原理实战:5分钟搞定词法分析器的选择题(含答案解析)

编译原理实战&#xff1a;词法分析器选择题高效解题指南 在编译原理的学习和考试中&#xff0c;词法分析器相关选择题往往是考察重点&#xff0c;也是许多同学容易失分的部分。面对复杂的正规式、有限自动机等概念&#xff0c;如何快速准确地做出判断&#xff1f;本文将带你深入…...

Qwen2.5-VL-3B视频识别实战:从环境搭建到显存优化的踩坑记录

Qwen2.5-VL-3B视频识别实战&#xff1a;从环境搭建到显存优化的全流程指南 当开发者第一次尝试用Qwen2.5-VL-3B处理视频内容时&#xff0c;往往会遇到各种预料之外的挑战。从依赖包缺失到显存爆炸&#xff0c;从环境配置到参数调试&#xff0c;每一步都可能成为阻碍项目推进的绊…...

XUnity.AutoTranslator:Unity游戏翻译解决方案的创新方法 | 玩家与开发者实战指南

XUnity.AutoTranslator&#xff1a;Unity游戏翻译解决方案的创新方法 | 玩家与开发者实战指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾因语言障碍错失优秀的外语游戏&#xff1f;是否在尝…...

Unity WebGL输入优化:跨平台文本输入解决方案的技术突破

Unity WebGL输入优化&#xff1a;跨平台文本输入解决方案的技术突破 【免费下载链接】WebGLInput IME for Unity WebGL 项目地址: https://gitcode.com/gh_mirrors/we/WebGLInput 在Unity WebGL应用的开发过程中&#xff0c;文本输入功能一直是开发者面临的核心挑战。传…...

在六亩半,春天不是日历上的数字,而是泥土间的青草香

当城市里的春天还停留在气温起伏的天气预报里&#xff0c;六亩半手作文创园的春意&#xff0c;早已从土地深处探出头来。那是荠菜嫩芽拱开泥土的力道&#xff0c;是柳条抽出新绿的柔软&#xff0c;是孩子们蹲在田埂上、指尖沾满青草汁液的鲜活记忆。在这里&#xff0c;春天不是…...

别再死记ResNet结构了!用PyTorch手搓一个ResNet-50,从零理解残差连接

从零构建ResNet-50&#xff1a;用PyTorch拆解残差网络的秘密 深度学习领域最令人着迷的突破之一&#xff0c;莫过于残差网络&#xff08;ResNet&#xff09;的诞生。2015年&#xff0c;何恺明团队提出的这一架构不仅横扫ImageNet竞赛&#xff0c;更彻底改变了我们对深度神经网络…...