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

3479. 水果成篮 III

Problem: 3479. 水果成篮 III

文章目录

  • 思路
  • 解题过程
  • 复杂度
  • Code

思路

线段树和二分思想,线段树维护baskets区间最大值,枚举fruits中的水果。

解题过程

  • 如果根节点(树的最大容量)小于fruits[i],表示没有这样大的篮子,返回-1。
  • 否则先递归左子树,再递归右子树,找到返回当前位置。
  • 找到需要更新线段树。

复杂度

  • 时间复杂度: O(nlogn)O(nlogn)O(nlogn)
  • 空间复杂度: O(n)O(n)O(n)

Code

class SegmentTree {
private:vector<int> maxTree; // 存储每个区间最大容量vector<bool> used;   // 标记区间是否完全被使用int n;               // 篮子的数量void build(int node, int start, int end, const vector<int>& baskets) {if (start == end) {                 // 叶子节点maxTree[node] = baskets[start]; // 最大容量等于该处篮子容量used[node] = false;             // 初始未使用return;}int mid = (start + end) / 2;build(2 * node, start, mid, baskets);       // 构建左子树build(2 * node + 1, mid + 1, end, baskets); // 构建右子树// 当前节点的最大容量是左右子树最大容量的最大值maxTree[node] = max(maxTree[2 * node], maxTree[2 * node + 1]);used[node] = false;}int query(int node, int start, int end, int val, int& pos) {// 区间完全使用或最大容量小于该种水果的数量if (used[node] || maxTree[node] < val)return -1;if (start == end) { // 叶子节点// 记录找到篮子的位置pos = start;return pos;}int mid = (start + end) / 2;// 查询左子树int leftPos = -1;if (query(2 * node, start, mid, val, leftPos) != -1) {pos = leftPos;return pos;}// 查询右子树int rightPos = -1;if (query(2 * node + 1, mid + 1, end, val, rightPos) != -1) {pos = rightPos;return pos;}return -1; // 整个区间无符合条件的篮子}void update(int node, int start, int end, int idx) {if (start == end) {     // 到达叶子节点maxTree[node] = -1; // 标记为已使用used[node] = true;  // 标记为已使用return;}// 递归更新子节点int mid = (start + end) / 2;if (idx <= mid) {update(2 * node, start, mid, idx);} else {update(2 * node + 1, mid + 1, end, idx);}// 更新父节点状态maxTree[node] = max(maxTree[2 * node], maxTree[2 * node + 1]);used[node] = (maxTree[2 * node] == -1 && maxTree[2 * node + 1] == -1);}public:SegmentTree(const vector<int>& baskets) {n = baskets.size();maxTree.resize(4 * n);used.resize(4 * n, false);build(1, 0, n - 1, baskets);}int findAndMark(int val) {int pos = -1;if (query(1, 0, n - 1, val, pos) != -1) {update(1, 0, n - 1, pos);return pos;}return -1;}
};class Solution {
public:int numOfUnplacedFruits(vector<int>& fruits, vector<int>& baskets) {SegmentTree st(baskets);int unplaced = 0;for (int f : fruits) {if (f == 0)continue;if (st.findAndMark(f) == -1) {unplaced++;}}return unplaced;}
};
http://www.dtcms.com/a/318377.html

相关文章:

  • Tiny-cuda-nn安装指南
  • CVE-2021-1879
  • Linux系统编程——环境变量、命令行参数
  • Dart语言语法与技术重点
  • 数据结构—队列和栈
  • openGauss单实例安装
  • YOLOv11改进:集成FocusedLinearAttention与C2PSA注意力机制实现性能提升
  • Redis使用的常见问题及初步认识
  • PLC学习之路-数据类型与地址表示-(二)
  • WinXP配置一键还原的方法
  • 【golang面试题】Golang递归函数完全指南:从入门到性能优化
  • 五十二、【Linux系统shell脚本】正则表达式演示
  • 202506 电子学会青少年等级考试机器人五级实际操作真题
  • 数据结构:栈、队列
  • C语言的数组与字符串练习题1
  • 18650电池组PACK自动化生产线:高效与品质的融合
  • 动物AI识别摄像头语音对讲功能
  • 大模型客户端工具如Cherry Studio,Cursor 配置mcp服务,容易踩的坑,总结
  • RPC框架之Kitex
  • 云手机和云真机之间存在的不同之处有什么?
  • [Oracle] LPAD()和RPAD()函数
  • Python实现电商商品数据可视化分析系统开发实践
  • 一、Istio基础学习
  • 自定义报表调研
  • 居家养老场景下摔倒识别准确率提升 29%:陌讯动态姿态建模算法实战解析
  • JuiceFS存储
  • C++实现线程池(5)计划线程池
  • Redis知识学习
  • 深度解析:AI如何重塑供应链?从被动响应到预测性防御的三大核心实践
  • (Python)待办事项升级网页版(html)(Python项目)