当前位置: 首页 > 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.dtcms.com/a/323486.html

相关文章:

  • C++ vector类
  • 3.2Vue Router路由导航
  • 【熵增与熵减:从混乱到有序的奥秘】
  • 词向量可视化:用TensorBoard或PCA探索词向量空间
  • 【JavaEE】(11) 前端基础三件套
  • 大数据与财务管理:未来就业的黄金赛道
  • java9学习笔记-part2
  • rosrun 和 roslaunch 区别
  • Busybox编译、制作initramfs,并在QEMU中运行
  • 医疗健康Agent:诊断辅助与患者管理的AI解决方案
  • rotary_emb 位置编码 加速
  • 练习uart和摄像头内核驱动开发测试
  • imx6ull-驱动开发篇15——linux自旋锁
  • 2025-08-09 李沐深度学习14——经典卷积神经网络 (2)
  • 【C++】模版进阶
  • redis存储原理与数据模型
  • 复数与频谱的联系
  • 库函数蜂鸣器的使用(STC8)
  • ECML PKDD 2025 | 时间序列(Time Series)论文总结
  • “秦时明月”提前布局商标被电视剧侵权!
  • 深入理解 RedisTemplate:简化 Java 与 Redis 的交互!
  • 【系统编程】进程创建
  • 本地进行语音文字互转
  • 国内外大模型体验与评测
  • Vue2 字段值映射通用方法
  • Python 属性描述符(描述符用法建议)
  • 基于Prometheus、Grafana、Loki与Tempo的统一监控平台故障排查与解决方案
  • redis开启局域网访问
  • C++讲解---通过转换函数和运算符函数直接调用类的对象
  • Horse3D引擎研发笔记(三):使用QtOpenGL的Shader编程绘制彩色三角形