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

Kimi K2.6 LeetCode 2234.花园的最大总美丽值 public long maximumBeauty(int[] flowers, long newFlowers

这是 LeetCode 2234. 花园的最大总美丽值(Maximum Total Beauty of the Gardens)的详细题解。

---

题目大意

有 `n` 个花园,`flowers[i]` 表示第 `i` 个花园已有的花数。你可以额外种最多 `newFlowers` 朵花。

- 完善的花园:花数 ≥ target,贡献 `full` 分。
- 不完善的花园:取所有不完善花园中花数的最小值 `min`,贡献 `min × partial` 分。

目标:最大化总美丽值。

---

核心思路

1. 预处理与特判
先把所有 `flowers[i] > target` 的截断到 `target`(因为花数超过 target 没有意义)。

假设所有花园都种满到 `target`,计算剩余花数:

```
left = newFlowers - Σ(target - flowers[i])
```

- 如果 `left == newFlowers`:说明所有花园本来就已经 ≥ target,直接返回 `n * full`。
- 如果 `left >= 0`:说明可以全部种满。但可能留一个花园只种到 `target-1` 更优(获得 `partial` 收益),取 `max(n*full, (n-1)*full + (target-1)*partial)`。

2. 枚举 + 双指针
如果无法全部种满,将 `flowers` 升序排序。

逆向思维:先假设所有花园都种满到 `target`,然后从左到右枚举不种满的花园前缀。

- 设后缀 `[i, n-1]` 是完善的(种满到 `target`),共 `n-i` 个。
- 前缀 `[0, i-1]` 是不完善的,需要把剩余的花 `left` 尽量平均分配,让最小值最大。

用双指针维护前缀中可以被提升到同一水平的最小花园数量 `j`:
- 条件:`flowers[j] * j <= pre_sum + left`,即剩余的花足够把前 `j` 个花园都提升到至少 `flowers[j]`。
- 最大最小值:`avg = (left + pre_sum) / j`(整数除法)。

总美丽值:`avg * partial + (n - i) * full`,取最大值即可。

---

Java 代码

```java
class Solution {
public long maximumBeauty(int[] flowers, long newFlowers, int target, int full, int partial) {
int n = flowers.length;

// 预处理:截断到 target,并计算假设全部种满后的剩余花数
long left = newFlowers - 1L * n * target;
for (int i = 0; i < n; i++) {
flowers[i] = Math.min(flowers[i], target);
left += flowers[i];
}

// 所有花园本来就已经 >= target
if (left == newFlowers) {
return 1L * n * full;
}

// 可以全部种满
if (left >= 0) {
return Math.max(1L * n * full, 1L * (n - 1) * full + 1L * (target - 1) * partial);
}

Arrays.sort(flowers);

long res = 0;
long preSum = 0;
int j = 0;

// 枚举 i:后缀 [i, n-1] 种满到 target(完善花园有 n-i 个)
for (int i = 1; i <= n; i++) {
// 撤销 flowers[i-1] 的"种满"操作,把它还回前缀
left += target - flowers[i - 1];

// 剩余花数为负,说明连这个后缀都种不满,跳过
if (left < 0) {
continue;
}

// 双指针:扩展 j,看前 j 个花园能否被提升到同一水平
while (j < i && 1L * flowers[j] * j <= preSum + left) {
preSum += flowers[j];
j++;
}

// 前 j 个花园的最大最小值(一定 < target,因为上面特判了)
long avg = (left + preSum) / j;
long totalBeauty = avg * partial + 1L * (n - i) * full;
res = Math.max(res, totalBeauty);
}

return res;
}
}
```

---

复杂度分析

项目 复杂度
时间 `O(n log n)` — 排序主导,后续枚举 + 双指针是 `O(n)`
空间 `O(1)` — 仅使用常数额外空间(排序是原地排序)

---

关键点总结

1. 逆向思维:先假设全满,再枚举哪些不满,避免正向分配花的复杂组合。
2. 双指针维护前缀:`j` 只会向右移动,配合前缀和 `preSum`,均摊 `O(n)`。
3. 特判全满情况:如果剩余花足够全满,还要比较"留一个到 target-1"的策略,因为 `partial` 可能很大。

> 参考:[灵茶山艾府题解](https://leetcode.cn/problems/maximum-total-beauty-of-the-gardens/solutions/1408882/) 及 [阿里云开发者社区](https://developer.aliyun.com/article/1424450)

http://www.jsqmd.com/news/782180/

相关文章:

  • KrkrzExtract:解密krkrz引擎资源处理的技术实践
  • 西安谷恩机械:酿醋生产设备全场景实测深度评测 - 奔跑123
  • CameraGraph 空间拓扑,跨镜连续追踪高危目标
  • 基于大语言模型的代码仓库自动化文档生成工具RepoAgent实战指南
  • STM32F103+DM542驱动42步进电机:从CubeMX配置到精准运动控制的保姆级教程
  • XHS-Downloader:小红书内容采集与下载架构解析
  • 保姆级教程:用Portainer中文版搞定远程Docker和Swarm集群管理(附TLS证书避坑指南)
  • 2026年小红书代运营服务指南:深圳昊客网络如何实现ROI 1:8的品效合一解决方案 - 深圳昊客网络
  • ARM嵌入式开发中的内存定位与优化技术
  • 容器化虚拟机实践:Docker整合QEMU/KVM实现轻量级虚拟化
  • 2026省电空气能取暖机十大品牌权威盘点!口碑top品牌选购指南来了 - 匠言榜单
  • 利用LLM与静态分析技术,实现代码库智能理解与文档生成
  • Python大麦网自动抢票脚本:告别手速慢,3分钟掌握抢票技巧
  • TPFanCtrl2:ThinkPad风扇智能控制终极解决方案,告别风扇噪音烦恼
  • 【译】TypeScript 7 测试版已在 Visual Studio 2026 18.6 Insiders 3 中默认启用
  • Gemini功能全不全?全面性与边界的深度解析
  • 告别动态输入烦恼:一份给OpenCV DNN用户的ONNX模型静态化改造指南
  • 告别跑飞!STM32低功耗项目调试心得:睡眠/停止/待机模式唤醒后的系统状态恢复全解析
  • 嵌入式实时状态机(RTSM)设计与优化实践
  • Martin Fowler 的 AI 研发提醒:非确定性进了研发链路,Harness 才真正开始承重
  • 网盘直链下载助手终极指南:告别限速困扰,解锁八大网盘真实下载链接
  • CG-36 瓷片式土壤水势传感器---解锁土壤水分的“密码”
  • Go语言实现ChatGPT飞书机器人:从部署到二次开发全指南
  • 四川/成都聚乙烯保温隔声卷材厂家|工程供货与定制服务指南 - 企业推荐师
  • Windows驱动存储管理器:RAPR工具深度解析与实战指南
  • DexViTac系统:触觉-视觉-运动协同的机器人灵巧操作平台
  • Glarity:AI浏览器扩展,重塑信息获取与处理方式
  • 告别SDK Manager!手把手教你用命令行搞定Jetson Orin Nano系统烧录(Ubuntu 20.04环境)
  • AI Agent编排平台ASDM AgentOrbit:从Docker到Kubernetes的生产级部署与管理
  • 多模态大模型专家级评估:MMMU与MMMU-Pro基准深度解析与实践指南