Leetcode Day01狒狒吃香蕉

狒狒喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。
狒狒可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 k 根。如果这堆香蕉少于 k 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉,下一个小时才会开始吃另一堆的香蕉。
狒狒喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。
返回她可以在 h 小时内吃掉所有香蕉的最小速度 k(k 为整数)。
题目链接

暴力解法:
肯定会超时,因为测试集的数据量还是比较大的

class Solution {
public:
    int minEatingSpeed(vector<int>& piles, int h) {
        int n=piles.size();
        sort(piles.begin(),piles.end());
        //试一下纯暴力的方法
        for(int k=piles[n-1];k>=1;k--){
            int cnt=0;
            
            for(int i=n-1;i>=0;i--){
                cnt=cnt+piles[i]/k+(piles[i]%k?1:0);
                
                if(cnt+i>h){
                    
                    return k+1;
                }
            }
            
        }
        return 1;
    }
};

二分法求解:
AC但是执行用时和内存消耗均为20%,不是特别理想

class Solution {
public:
    bool suit(vector<int>& piles,int n,int k,int h){
        int cnt=0;
        for(int i=n-1;i>=0;i--){
            cnt+=piles[i]/k;
            if(piles[i]%k){
                cnt+=1;
            }
            if(cnt>h){
                return false;
            }
        }
        return true;
    }
    int minEatingSpeed(vector<int>& piles, int h) {
        int n=piles.size();
        sort(piles.begin(),piles.end());
        
        //二分法
        int right=piles[n-1];
        int left=1;
        while(left<=right){
            int mid=(left+right)>>1;
            if(suit(piles,n,mid,h)){
                right=mid-1;
            }else{
                left=mid+1;
            }
        }
        return left;
    }
};

你可能感兴趣的:(算法笔记入门,leetcode,算法,c++)