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

leetcode-C语言-3479.水果成篮 III

解析题目有以下特点:

  1. 篮子中只能放置一种水果,可在找到对应篮子后将其置0表示不可再放置
  2. 水果不能拆分放到两个篮子

解析题目有以下问题:

  1. 如何在数组中找到大于目标数量的第一个值的索引 :
  • 暴力解法:直接遍历,找到值后将该值置为0
  • 分块:查看题解有此解法,将数组划分为n\sqrt{n}n个区间,从左到右依次比较,时间复杂度为O[n∗n]O[n*\sqrt{n}]O[nn] (n为遍历fruits,)
  • 线段树:通过线段树记录区间的最大值,查询线段树。由于没有区间最大值没有顺序,最大时间复杂度为O[n2]O[n^2]O[n2],但通过剪枝在实际运行可降低复杂度。

代码如下:

int Lchild(int root) {return root << 1;
}
int Rchild(int root) {return (root << 1) | 1;
}
// 建立线段树
void Build(int tree[], int baskets[], int root, int l, int r) {if(l == r) {tree[root] = baskets[l-1];return;}int mid = l + ((r - l) >> 1);Build(tree, baskets, Lchild(root), l, mid);Build(tree, baskets, Rchild(root), mid+1, r);tree[root] = tree[Lchild(root)] > tree[Rchild(root)] ? tree[Lchild(root)] : tree[Rchild(root)];return;
}
// 更新线段树
void Update(int tree[], int root, int l, int r, int pos, int value) {if(l == r) {tree[root] = value;return;}int mid = l + ((r - l) >> 1);if(pos <= mid) {Update(tree, Lchild(root), l, mid, pos, value);}else {Update(tree, Rchild(root), mid+1, r, pos, value);}tree[root] = tree[Lchild(root)] > tree[Rchild(root)] ? tree[Lchild(root)] : tree[Rchild(root)];return;
}
// 查询线段树
int Query(int tree[], int root, int l, int r, int fruitNum) {if(l == r) {return tree[root] >= fruitNum ? l-1 : -1;}// 剪枝if(tree[root] < fruitNum) return -1;int mid = l + ((r - l) >> 1);int tmp = Query(tree, Lchild(root), l, mid, fruitNum);if(tmp != -1) return tmp;tmp = Query(tree, Rchild(root), mid+1, r, fruitNum);return tmp;
}int numOfUnplacedFruits(int* fruits, int fruitsSize, int* baskets, int basketsSize) {// 设置线段树的长度为叶子节点这一层为满二叉树时的数量的二倍int n = log(basketsSize)/log(2);if(basketsSize > (1<<n)) n++;n = (1 << n);n = (n << 1);int tree[n+1];memset(tree, 0, sizeof(int)*(n+1));Build(tree, baskets, 1, 1, basketsSize);int res = 0;for(int i=0; i<fruitsSize; i++) {// 返回大于fruits[i]的篮子索引int idex = Query(tree, 1, 1, basketsSize, fruits[i]);if(idex != -1) Update(tree, 1, 1, basketsSize, idex+1, 0);else res++;}return res;
}
http://www.lryc.cn/news/615523.html

相关文章:

  • 写 SPSS文件系统
  • Linux软件编程:shell
  • 组合期权:垂直价差
  • C++ 中的智能指针
  • 电子电气架构 --- 电气/电子架构迁移已拉开帷幕
  • Oracle数据库重启后打开异常状态的检查步骤
  • 一周学会Matplotlib3 Python 数据可视化-网格 (Grid)
  • [IOMMU]面向芯片/SoC验证工程的IOMMU全景速览
  • C# 通过第三方库INIFileParser管理INI配置文件
  • 智慧园区误报率↓76%:陌讯多模态融合算法实战解析
  • 202506 电子学会青少年等级考试机器人一级理论综合真题
  • 闲鱼智能监控机器人:基于 Playwright 与 AI 的多任务监控分析工具
  • 2025年SEVC SCI2区,基于深度强化学习与模拟退火的多无人机侦察任务规划,深度解析+性能实测
  • Dify 从入门到精通(第 24/100 篇):Dify 的实时数据处理与流式输出
  • 微积分 | 外微分
  • HUAWEI交换机命令基础
  • java基础(六)jvm
  • 微信小程序中实现表单自动填充功能的方法
  • Linux网络子系统架构分析
  • P1025 [NOIP 2001 提高组] 数的划分 题解
  • 基于麦克风阵列电机噪声振动监测解决方案技术解析
  • “自动报社保 + 查询导出 ” 的完整架构图和 Playwright C# 项目初始化模板
  • BroadcastChannel:轻松实现前端跨页面通信
  • 06-docker容器常用命令
  • 全栈:JDBC驱动版本和SQLserver版本是否有关系?怎么选择JDBC的版本号?
  • 自然语言交互与数据库智能客户端比对
  • SpringBoot配置生效优先级
  • 机器学习第七课之支持向量机SVM
  • Java Callback 实现线程切换以及与Kotlin原理关系
  • 数码管的使用(STC8)