最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

leetcode 力扣 907 爱吃香蕉的珂珂 题解 算法题

IT圈 admin 30浏览 0评论

2024年5月23日发(作者:犹浩歌)

题目:爱吃香蕉的珂珂

珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,

将在 H 小时后回来。

珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香

蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时

内不会再吃更多的香蕉。

珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。

返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。

示例 1:

输入: piles = [3,6,7,11], H = 8

输出: 4

示例 2:

输入: piles = [30,11,23,4,20], H = 5

输出: 30

示例 3:

输入: piles = [30,11,23,4,20], H = 6

输出: 23

提示:

• 1 <= <= 10^4

• <= H <= 10^9

• 1 <= piles[i] <= 10^9

语言:cpp

class Solution {

public:

int minEatingSpeed(vector& piles, int H) {

int lo = 1, hi = pow(10, 9);

while (lo < hi) {

int mi = lo + (hi - lo) / 2;

if (!possible(piles, H, mi))

lo = mi + 1;

else

hi = mi;

}

return lo;

}

// Can Koko eat all bananas in H hours with eating speed K?

bool possible(vector& piles, int H, int K) {

int time = 0;

for (int p: piles)

time += (p - 1) / K + 1;

return time <= H;

}

};

语言:java

class Solution {

public int minEatingSpeed(int[] piles, int H) {

int lo = 1;

int hi = 1_000_000_000;

while (lo < hi) {

int mi = (lo + hi) / 2;

if (!possible(piles, H, mi))

lo = mi + 1;

else

hi = mi;

}

return lo;

}

// Can Koko eat all bananas in H hours with eating speed K?

public boolean possible(int[] piles, int H, int K) {

int time = 0;

for (int p: piles)

time += (p-1) / K + 1;

return time <= H;

}

}

语言:java

class Solution {

public int minEatingSpeed(int[] piles, int h) {

// 先确定单调关系 该题目中 耗时和速度是单调递减的关系

// 如果耗时越多则速度越小 , 速度越小则耗时越大

(piles);

if(h==) return piles[-1];

int left = 1;

int right = piles[-1];

while(left<=right){

int middle = (left + right) / 2;

if(getTime(piles,middle)>h) left = middle+1;

else {

right = middle-1;

}

}

//找到最接近消耗时间 h的速率,该速率为要找的答案

return left;

}

public int getTime(int []piles,int speed){

int res = 0;

for(int bananaNumber:piles){

res = res + (bananaNumber / speed);

if(bananaNumber % speed !=0){

res++;

}

}

return res;

}

}

语言:java

class Solution {

public int minEatingSpeed(int[] piles, int h) {

int left = 1;

int right = 1000000000;

while(left < right){

int mid = left + (right - left)/2;

if(f(piles, mid) <= h){

right = mid;

}else{

left = mid + 1;

}

}

return left;

}

// 返回以速度v吃完piles中的所有香蕉需要多少小时

public int f(int[] piles, int v){

int hours = 0;

for(int i = 0; i < ; i++){

hours += piles[i]/v;

if(piles[i] % v > 0){

hours++;

}

}

return hours;

}

}

语言:python

class Solution(object):

def minEatingSpeed(self, piles, H):

# Can Koko eat all bananas in H hours with eating speed K?

def possible(K):

return sum((p-1) / K + 1 for p in piles) <= H

lo, hi = 1, max(piles)

while lo < hi:

mi = (lo + hi) / 2

if not possible(mi):

lo = mi + 1

else:

hi = mi

return lo

语言:python

class Solution(object):

def minEatingSpeed(self, piles, h):

def cost_t(speed):

temp = 0

for x in piles:

temp += x//speed + (0+(x%speed>0))

return temp

left, right = 1, max(piles)

while left < right:

mid = left + (right-left)//2

cost = cost_t(mid)

if cost>h:

left = mid+1

elif cost<=h:

right = mid

return left

语言:js

var minEatingSpeed = function(piles, h) {

// 每小时吃 k 根, 最小是 1 根, 从 1 开始试吃

let k = 1

// 一直试吃

while(true) {

// 可以吃完,返回 k

if(canFinish(...)) {

return k

}

// 当不能吃完的时候,多吃一根再试试

k++

}

};

语言:js

// 每小时吃 k, 有 piles 堆, 给了 h 小时

function canFinish(k, h, piles) {

// 假设总时间为 total, 当 total 大于 h 的时候,说明吃不完

let totalTime = 0

// 循环每堆

for (var i = 0; i < ; i++) {

// 当香蕉少于 k 的时候,当成 1 小时算

if (piles[i] <= k) {

totalTime += 1

// 当香蕉大于 k 的时候,多出的部分按1小时记

} else {

totalTime += (piles[i] / k)

}

// 已经超时了?那就直接返回吃不完,不再继续吃

if (totalTime > h) {

return false

}

}

// 最后吃完了

return true

}

语言:js

var minEatingSpeed = function (piles, h) {

// 每小时吃 k 根, 最小是 1 根, 从 1 开始试吃

let k = 1

// 一直试吃

while (true) {

// 可以吃完,返回 k

if (canFinish(k, h, piles)) {

return k

}

// 当不能吃完的时候,多吃一根再试试

k++

}

}

// 每小时吃 k, 有 piles 堆, 给了 h 小时

function canFinish(k, h, piles) {

// 假设总时间为 total, 当 total 大于 h 的时候,说明吃不完

let totalTime = 0

// 循环每堆

for (var i = 0; i < ; i++) {

// 当香蕉少于 k 的时候,当成 1 小时算

if (piles[i] <= k) {

totalTime += 1

// 当香蕉大于 k 的时候,多出的部分按1小时记

} else {

totalTime += (piles[i] / k)

}

// 已经超时了?那就直接返回吃不完,不再继续吃

if (totalTime > h) {

return false

}

}

// 最后吃完了

return true

}

语言:golang

func minEatingSpeed(piles []int, h int) int {

left := 0

right := 0

for _, pile := range piles {

right = max(right, pile)

}

for left < right {

mid := left + (right - left) / 2

if 0 == mid { //如果mid == 0,则每小时吃<1数量也能吃完,则返回1

return 1

}

if getHours(piles, mid) <= h { //如果速度为mid,时间<=h,则速度快,将rig

ht调整到mid

right = mid

} else if getHours(piles, mid) > h { //如果速度为mid,时间>h,则速度慢,将

left调整到mid

left = mid + 1

}

}

return left

}

func getHours(piles []int, x int) int {

hours := 0

for _, pile := range piles {

hours += pile / x //计算pile个香蕉吃几个小时能吃完

if pile % x > 0 {

hours++

}

}

return hours

}

func max(a, b int) int {

if a > b {

return a

}

return b

}

func min(a, b int) int {

if a < b {

return a

}

return b

}

语言:php

class Solution {

/**

* @param Integer[] $piles

* @param Integer $h

* @return Integer

*/

function minEatingSpeed($piles, $h) {

$left=1;

$right=max($piles);

while($left<=$right){

//二分查找

$mid=$left+floor(($right-$left)/2);

if($this->canFinish($piles,$mid,$h)){

$right=$mid-1;

}else{

$left=$mid+1;

}

}

return $left;

}

function canFinish($piles,$speed, $h){

//以speed速度,在h小时内是否可以吃

完所有香蕉

$time=0;

foreach($piles as $k=>$v){

$time+=$this->timeOf($v,$speed);

}

return $time<=$h;

}

function timeOf($num,$speed){

//以speed速度,吃完num数量香蕉,需要多

return ceil($num/$speed);

}

}

2024年5月23日发(作者:犹浩歌)

题目:爱吃香蕉的珂珂

珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,

将在 H 小时后回来。

珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香

蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时

内不会再吃更多的香蕉。

珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。

返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。

示例 1:

输入: piles = [3,6,7,11], H = 8

输出: 4

示例 2:

输入: piles = [30,11,23,4,20], H = 5

输出: 30

示例 3:

输入: piles = [30,11,23,4,20], H = 6

输出: 23

提示:

• 1 <= <= 10^4

• <= H <= 10^9

• 1 <= piles[i] <= 10^9

语言:cpp

class Solution {

public:

int minEatingSpeed(vector& piles, int H) {

int lo = 1, hi = pow(10, 9);

while (lo < hi) {

int mi = lo + (hi - lo) / 2;

if (!possible(piles, H, mi))

lo = mi + 1;

else

hi = mi;

}

return lo;

}

// Can Koko eat all bananas in H hours with eating speed K?

bool possible(vector& piles, int H, int K) {

int time = 0;

for (int p: piles)

time += (p - 1) / K + 1;

return time <= H;

}

};

语言:java

class Solution {

public int minEatingSpeed(int[] piles, int H) {

int lo = 1;

int hi = 1_000_000_000;

while (lo < hi) {

int mi = (lo + hi) / 2;

if (!possible(piles, H, mi))

lo = mi + 1;

else

hi = mi;

}

return lo;

}

// Can Koko eat all bananas in H hours with eating speed K?

public boolean possible(int[] piles, int H, int K) {

int time = 0;

for (int p: piles)

time += (p-1) / K + 1;

return time <= H;

}

}

语言:java

class Solution {

public int minEatingSpeed(int[] piles, int h) {

// 先确定单调关系 该题目中 耗时和速度是单调递减的关系

// 如果耗时越多则速度越小 , 速度越小则耗时越大

(piles);

if(h==) return piles[-1];

int left = 1;

int right = piles[-1];

while(left<=right){

int middle = (left + right) / 2;

if(getTime(piles,middle)>h) left = middle+1;

else {

right = middle-1;

}

}

//找到最接近消耗时间 h的速率,该速率为要找的答案

return left;

}

public int getTime(int []piles,int speed){

int res = 0;

for(int bananaNumber:piles){

res = res + (bananaNumber / speed);

if(bananaNumber % speed !=0){

res++;

}

}

return res;

}

}

语言:java

class Solution {

public int minEatingSpeed(int[] piles, int h) {

int left = 1;

int right = 1000000000;

while(left < right){

int mid = left + (right - left)/2;

if(f(piles, mid) <= h){

right = mid;

}else{

left = mid + 1;

}

}

return left;

}

// 返回以速度v吃完piles中的所有香蕉需要多少小时

public int f(int[] piles, int v){

int hours = 0;

for(int i = 0; i < ; i++){

hours += piles[i]/v;

if(piles[i] % v > 0){

hours++;

}

}

return hours;

}

}

语言:python

class Solution(object):

def minEatingSpeed(self, piles, H):

# Can Koko eat all bananas in H hours with eating speed K?

def possible(K):

return sum((p-1) / K + 1 for p in piles) <= H

lo, hi = 1, max(piles)

while lo < hi:

mi = (lo + hi) / 2

if not possible(mi):

lo = mi + 1

else:

hi = mi

return lo

语言:python

class Solution(object):

def minEatingSpeed(self, piles, h):

def cost_t(speed):

temp = 0

for x in piles:

temp += x//speed + (0+(x%speed>0))

return temp

left, right = 1, max(piles)

while left < right:

mid = left + (right-left)//2

cost = cost_t(mid)

if cost>h:

left = mid+1

elif cost<=h:

right = mid

return left

语言:js

var minEatingSpeed = function(piles, h) {

// 每小时吃 k 根, 最小是 1 根, 从 1 开始试吃

let k = 1

// 一直试吃

while(true) {

// 可以吃完,返回 k

if(canFinish(...)) {

return k

}

// 当不能吃完的时候,多吃一根再试试

k++

}

};

语言:js

// 每小时吃 k, 有 piles 堆, 给了 h 小时

function canFinish(k, h, piles) {

// 假设总时间为 total, 当 total 大于 h 的时候,说明吃不完

let totalTime = 0

// 循环每堆

for (var i = 0; i < ; i++) {

// 当香蕉少于 k 的时候,当成 1 小时算

if (piles[i] <= k) {

totalTime += 1

// 当香蕉大于 k 的时候,多出的部分按1小时记

} else {

totalTime += (piles[i] / k)

}

// 已经超时了?那就直接返回吃不完,不再继续吃

if (totalTime > h) {

return false

}

}

// 最后吃完了

return true

}

语言:js

var minEatingSpeed = function (piles, h) {

// 每小时吃 k 根, 最小是 1 根, 从 1 开始试吃

let k = 1

// 一直试吃

while (true) {

// 可以吃完,返回 k

if (canFinish(k, h, piles)) {

return k

}

// 当不能吃完的时候,多吃一根再试试

k++

}

}

// 每小时吃 k, 有 piles 堆, 给了 h 小时

function canFinish(k, h, piles) {

// 假设总时间为 total, 当 total 大于 h 的时候,说明吃不完

let totalTime = 0

// 循环每堆

for (var i = 0; i < ; i++) {

// 当香蕉少于 k 的时候,当成 1 小时算

if (piles[i] <= k) {

totalTime += 1

// 当香蕉大于 k 的时候,多出的部分按1小时记

} else {

totalTime += (piles[i] / k)

}

// 已经超时了?那就直接返回吃不完,不再继续吃

if (totalTime > h) {

return false

}

}

// 最后吃完了

return true

}

语言:golang

func minEatingSpeed(piles []int, h int) int {

left := 0

right := 0

for _, pile := range piles {

right = max(right, pile)

}

for left < right {

mid := left + (right - left) / 2

if 0 == mid { //如果mid == 0,则每小时吃<1数量也能吃完,则返回1

return 1

}

if getHours(piles, mid) <= h { //如果速度为mid,时间<=h,则速度快,将rig

ht调整到mid

right = mid

} else if getHours(piles, mid) > h { //如果速度为mid,时间>h,则速度慢,将

left调整到mid

left = mid + 1

}

}

return left

}

func getHours(piles []int, x int) int {

hours := 0

for _, pile := range piles {

hours += pile / x //计算pile个香蕉吃几个小时能吃完

if pile % x > 0 {

hours++

}

}

return hours

}

func max(a, b int) int {

if a > b {

return a

}

return b

}

func min(a, b int) int {

if a < b {

return a

}

return b

}

语言:php

class Solution {

/**

* @param Integer[] $piles

* @param Integer $h

* @return Integer

*/

function minEatingSpeed($piles, $h) {

$left=1;

$right=max($piles);

while($left<=$right){

//二分查找

$mid=$left+floor(($right-$left)/2);

if($this->canFinish($piles,$mid,$h)){

$right=$mid-1;

}else{

$left=$mid+1;

}

}

return $left;

}

function canFinish($piles,$speed, $h){

//以speed速度,在h小时内是否可以吃

完所有香蕉

$time=0;

foreach($piles as $k=>$v){

$time+=$this->timeOf($v,$speed);

}

return $time<=$h;

}

function timeOf($num,$speed){

//以speed速度,吃完num数量香蕉,需要多

return ceil($num/$speed);

}

}

发布评论

评论列表 (0)

  1. 暂无评论