LeetCode 875 - Koko Eating Bananas


https://leetcode.com/problems/koko-eating-bananas/
Koko loves to eat bananas.  There are N piles of bananas, the i-th pile has piles[i] bananas.  The guards have gone and will come back in H hours.
Koko can decide her bananas-per-hour eating speed of K.  Each hour, she chooses some pile of bananas, and eats K bananas from that pile.  If the pile has less than K bananas, she eats all of them instead, and won't eat any more bananas during this hour.
Koko likes to eat slowly, but still wants to finish eating all the bananas before the guards come back.
Return the minimum integer K such that she can eat all the bananas within H hours.

coco去吃香蕉,时间最多只有H小时,但这个吃货会享受,她想在用最慢的速度去吃。吃的速度是K,代表一个小时吃多少香蕉。这吃货懒到什么地步?当一个小时以内她就把这堆里边的香蕉吃完了,那她就停下来歇着,等待下一个小时继续吃。求她吃东西的最慢的速度。
二叉搜索的变种题目。因为有个最慢的速度而且是整数。

这个速度的范围一定在1和max(piles)之间,如果大于max(piles)肯定不是最慢速度。然后我们使用二分,计算在某个速度之下吃完的时间是否满足时间H。如果时间比H大,说明她吃的太快了,应该降低速度;反之应该加快速度。

吃每堆香蕉的时间是math.ceil(pile / speed)。

时间复杂度是O(logn),空间复杂度是O(1)。
  1. 去找一个值满足某种条件,这种题见得太多了,显然是二分法,之后我整理一下所有的这种题目做一个合辑。
  2. 那么这里怎么选定初始的lo和hi呢?我们要明确我们找的是吃的速度,那么最低,起码得在吃吧,所以起码lo = 1 or min(piles),那hi呢?我们注意到note中第二点pile.length <= H,因为我们吃的速度就算再快,一次也只能吃一盘而已,所以无论怎样最少都得pile.length个小时才能吃完,所以hi = max(piles)
    public int minEatingSpeed(int[] piles, int H) {
        Arrays.sort(piles); // no need sort to get max
        long total = 0;
        for(int pile : piles) total += pile;
        int min = (int)Math.ceil(total/(double)H);
        int max = piles[piles.length - 1];
        while (min < max){
            if (canFinish(piles, min, H)) return min;
            if (canFinish(piles, (min + max) / 2, H)) max = (min + max)/2;
            else min = (min + max) / 2 + 1;
        }
        return (int)min;
    }
    
    
    private boolean canFinish(int[] piles, int speed, int target){
        long counter = 0;
        for (int pile : piles){
            counter += Math.ceil(pile / (double)speed);
        }
        return (int)counter <= target;
    }



If Koko can finish eating all the bananas (within H hours) with an eating speed of K, she can finish with a larger speed too.
If we let possible(K) be true if and only if Koko can finish with an eating speed of K, then there is some X such that possible(K) = True if and only if K >= X.
For example, with piles = [3, 6, 7, 11] and H = 8, there is some X = 4 so that possible(1) = possible(2) = possible(3) = False, and possible(4) = possible(5) = ... = True.
Algorithm
We can binary search on the values of possible(K) to find the first X such that possible(X) is True: that will be our answer. Our loop invariant will be that possible(hi) is always True, and lo is always less than or equal to the answer. For more information on binary search, please visit [LeetCode Explore - Binary Search].
To find the value of possible(K), (ie. whether Koko with an eating speed of K can eat all bananas in Hhours), we simulate it. For each pile of size p > 0, we can deduce that Koko finishes it in Math.ceil(p / K) = ((p-1) // K) + 1 hours, and we add these times across all piles and compare it to H.
Time Complexity: O(N \log W), where N is the number of piles, and W is the maximum size of a pile.
Each hour, Koko chooses some pile of bananas, and eats K bananas from that pile. There is a limited range of K's to enable her to eat all the bananas within H hours. We ought to reduce the searching space and to return the minimum valid KminPileBinary Search is born for that.
Initially, we know that K belongs to [1, maxPile], (maxPile is the largest element in piles[]). And we follow the pattern of the Binary Search: get the corresponding hourNeeded, compare to target H and reduce the searching range until the minPile and maxPile overlapped.
Please note that when minPile == maxPile we do one more check. If hourNeeded <= H currently, minPile does not change and will be returned. Or else, we increase minPile by 1 and return it.
    public int minEatingSpeed(int[] piles, int H) {  
        
        int minPile = 1, maxPile = Integer.MIN_VALUE; 
        for (int tmp : piles) {
            maxPile = Math.max(maxPile, tmp);
        }
        
        while (minPile <= maxPile) {
            int hourNeeded = 0;
            int i = minPile + (maxPile - minPile) / 2;
            for (int tmp : piles) {
                if (tmp <= i) {
                    hourNeeded++;
                } else if (tmp % i != 0) {
                    hourNeeded += tmp / i + 1;
                } else {
                    hourNeeded += tmp / i;
                }
            }
            if (hourNeeded <= H) {
                maxPile = i - 1;
            }
            else {
                minPile = i + 1;
            }
        }
        
        return minPile;
    }
Here you find another similar problem.
774. Minimize Max Distance to Gas Station
(p + m - 1) / m equal to ceil(p / m) (just personal behavior)


  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;
  }





Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts