当前位置: 首页 > 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.lryc.cn/news/611548.html

相关文章:

  • Minio 高性能分布式对象存储
  • 分布式光伏气象站:安装与维护
  • 【论文分析】【Agent】SEW: Self-Evolving Agentic Workflows for Automated Code Generatio
  • 支持多网络协议的测试工具(postman被无视版)
  • 【概念学习】早期神经网络
  • ORACLE 19C建库时卡在46%、36%
  • Godot ------ 初级人物血条制作01
  • OpenAI开源大模型gpt-oss系列深度解析:从120B生产级到20B桌面级应用指南
  • Unity3D中的Controller:深入解析动画控制器的核心概念与应用
  • 【数据库】Oracle学习笔记整理之一:ORACLE的核心组成部分
  • 【YOLOv8改进 - C2f融合】C2f融合DBlock(Decoder Block):解码器块,去模糊和提升图像清晰度
  • 微信小程序最大层级跳转问题
  • [Oracle] SIGN()函数
  • RabbitMQ 全面指南:从基础概念到高级特性实现
  • Unix/Linux 系统编程中用于管理信号处理行为的核心概念或模型
  • 外观模式(Facade Pattern)及其应用场景
  • Leetcode-3488距离最小相等元素查询
  • 系统的缓存(buff/cache)是如何影响系统性能的?
  • 第五十篇:AI画家的“神经中枢”:ComfyUI的推理路径与缓存逻辑深度解析
  • 【Web安全】csrf、ssrf和xxe的区别
  • Python实现电商商品数据可视化分析系统开发实践
  • Qt 中实现多线程的两种方式及结合
  • Pytest项目_day05(requests加入headers)
  • 8.6 JavaWeb(请求响应 P67-P74)
  • 部署Web UI自动化测试平台:SeleniumFlaskTester
  • UI测试平台TestComplete的AI视觉引擎技术解析
  • QT+opencv+yolov8推理
  • 移动端跨平台框架(支持Harmony、iOS、Android)
  • C语言:指针(1-2)
  • Kaggle 经典竞赛泰坦尼克号:超级无敌爆炸详细基础逐行讲解Pytorch实现代码,看完保证你也会!!!