From 13afe04e8345d2fb7876c86f123561fb3ddb4b90 Mon Sep 17 00:00:00 2001 From: cchroot <843328872@qq.com> Date: Wed, 11 Nov 2020 21:21:20 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90875.=20=E7=88=B1=E5=90=83=E9=A6=99?= =?UTF-8?q?=E8=95=89=E7=9A=84=E7=8F=82=E7=8F=82=E3=80=91=E3=80=90C++?= =?UTF-8?q?=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 提供 C++ 解法 --- 高频面试系列/koko偷香蕉.md | 35 ++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/高频面试系列/koko偷香蕉.md b/高频面试系列/koko偷香蕉.md index cc880dd..c44f083 100644 --- a/高频面试系列/koko偷香蕉.md +++ b/高频面试系列/koko偷香蕉.md @@ -169,4 +169,37 @@ for (int i = 0; i < n; i++)

-======其他语言代码====== \ No newline at end of file +======其他语言代码====== + +[cchroot](https://github.com/cchroot) 提供 C++ 代码: + +```c++ +class Solution { +public: + int minEatingSpeed(vector& piles, int H) { + // 二分法查找最小速度 + // 初始化最小速度为 1,最大速度为题目设定的最大值 10^9 + // 这里也可以遍历 piles 数组,获取数组中的最大值,设置 right 为数组中的最大值即可(因为每堆香蕉1小时吃完是最快的) + // log2(10^9) 约等于30,次数不多,所以这里暂时就不采取遍历获取最大值了 + int left = 1, right = pow(10, 9); + while (left < right) { // 二分法基本的防止溢出 + int mid = left + (right - left) / 2; + // 以 mid 的速度吃香蕉,是否能在 H 小时内吃完香蕉 + if (!canFinish(piles, mid, H)) + left = mid + 1; + else + right = mid; + } + return left; + } + + // 以 speed 的速度是否能把香蕉吃完 + bool canFinish(vector& piles, int speed, int H) { + int time = 0; + // 遍历累加时间 time + for (int p: piles) + time += (p - 1) / speed + 1; + return time <= H; // time 小于等于 H 说明能在 H 小时吃完返回 true, 否则返回 false + } +}; +```