Coke Machine - 1point3acres


https://docs.google.com/document/d/1qxA2wps0IhVRWULulQ55W4SGPMu2AE5MkBB37h8Dr58/

可乐饮料机

18. 可乐饮料机 高频 5次

有一系列按钮,每个按钮按下去会得到一定体积范围的可乐。先给定一个目标体积范围,问不限制按按钮次数,能否确定一定能得到目标范围内的可乐?
举例:有三个按钮,按下去得到的范围是[100, 120], [200, 240], [400, 410],
假设目标是[100, 110], 那答案是不能。因为按下一,可能得到120体积的可乐,不在目标范围里。
假设目标是[90, 120],那答案是可以。因为按下一,一定可以得到此范围内的可乐。
假设目标是[300, 360], 那答案是可以,因为按下一再按二,一定可以得到此范围内
假设目标是[310, 360], 那答案是不能,因为按下一再按二,有可能得到300,永远没可能确定得到这个范围内的可乐。
假设目标是[1, 9999999999],那答案是可以。随便按一个都确定满足此范围。
思路:dfs+memorization从0开始暴力解  一开始[0, 0] 通过bfs、dfs往上加直到出界

请问这道题目如果用dfs + memo的时间复杂度是不是 n!, n是bottom的size,如果不是的话,时间复杂度怎么分析?

这里的memorication不用记录true的情况,因为会直接返回不会将结果用于其他地方,所以用一个hashset存false的情况就可以了
这其实可以看做是自顶向下的dp
O(MNK)
public static boolean dfs(List<Soda> sodas, int volumeLower, int volumeUpper,
                             int targetLower, int targetUpper, Map<String, Boolean> memo) {
        
       Boolean val = memo.get(volumeLower + "-" + volumeUpper);
       if (val != null) {
           return val;
       }
        
       if (volumeLower >= targetLower && volumeUpper <= targetUpper) {
           return true;
       }
       if (volumeUpper > targetUpper) {
           return false;
       }
        // if (volumeUpper - volumeLower > targetUpper - targetLower) retuurn false;
       for (Soda soda : sodas) {
           if (dfs(sodas, volumeLower + soda.lower, volumeUpper + soda.upper, targetLower, targetUpper, memo)) {//false的子问题会重复计算
               memo.put(volumeLower + "-" + volumeUpper, true);
               return true;
           }
       }
        
       memo.put(volumeLower + "-" + volumeUpper, false);
       return false;
   }
据说这题是binary search?  这个应该bfs,dfs都能做。但是据说还可以用dp,dp怎么做啊。谁能po个解法?
区间DP的做法:(Provider: anonym)
public static boolean coke(List<List<Integer>> buttons, List<Integer> target) {
   int m = target.get(0);
   int n = target.get(1);
   boolean[][] dp = new boolean[m + 1][n + 1];
   
   //Init
   for (int i = 0; i <= m; ++i) {
     for (int j = 0; j <= n; ++j) {
       for (List<Integer> button: buttons) {
         if (i <= button.get(0) && j >= button.get(1)) {
           dp[i][j] = true;
           break;
         }
       }
     }
   }
 
   for (int i = 0; i <= m; ++i) {
     for (int j = 0; j <= n; ++j) {
       for (List<Integer> button: buttons) {
         int preL = i - button.get(0);
         int preR = j - button.get(1);
         if (preL >= 0 && preR >= 0 && dp[preL][preR]) {
           dp[i][j] = true;
          break;
         }
       }
     }
   }
   
   return dp[m][n];
 }
这算是一个多重背包问题。我曾经被面到过一个类似的:给一个调色板由一堆颜色组成,每个颜色有RGB三个分量。问能否调出一个目标颜色


https://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=453698

应该是背包问题,先来个简单的DFS + Memo,有空再想 DP和补Test Case
def vendor_machine(sodas, target_low, target_high):
     
    def dfs(curr_low, curr_high, memo={}):
        if (curr_low, curr_high) in memo:
            return memo[curr_low, curr_high]
        if curr_high > target_high:
            return False       
        if target_low <= curr_low and curr_high <= target_high:
            return True
        for low, high in sodas:
            if dfs(curr_low + low, curr_high + high):
                memo[curr_low, curr_high] = True
                return True
        memo[curr_low, curr_high] = False
        return False
    return dfs(0, 0)



这是一道非常简单的递归题。假设[a,b]表示按某个钮操作得到的饮料的体积范围,[A,B]表示我们需要得到的饮料的体积范围,那么题意告诉我们如果满足 A<=a && b<=B的话,那么就能满足条件。如果不能满足怎么办?我们试着将待求的[A,B]减去[a,b],剩下的范围是[A-a,B-b]。我们这个时候仔细想一下,就会发现,假设[A-a,B-b]能够通过饮料机的操作得到,那么自然我们再操作一次[a,b],就能得到[A,B]了。所以递归的关系就找到了。边界条件是[A,B]能被某一个操作满足,或者直到A<0都无法实现。

如果递归的层数特别多,可以记忆化一下。
bool solution(vector<vector<int>>&p, int A, int B)
{
    if (A<0) return false;
     
    for (int i=0; i<p.size(); i++)
    {
        if (A<=p[i][0] && B>=p[i][1])
            return true;
    }
     
    for (int i=0; i<p.size(); i++)
    {
        if (solution(p,A-p[i][0],B-p[i][1]))
            return true;
    }
    return false;
}

有点像combination sum 的区间版
**首次发代码,给一个naive的递归解法,指数级时间复杂度O(2^N)


struct interval
{
   int start;
   int end;
   interval(int a, int b)
   {
      start = a;
      end = b;
   }
};

bool getCoca(vector<interval> vec, interval target, int depth)
{
   if(depth == vec.size()) return false;
   if(target.start <= vec[depth].start && target.end >= vec[depth].end) return true;

   if(target.start > vec[depth].start && target.end > vec[depth].end)
   {
      if( getCoca(vec, interval(target.start-vec[depth].start, target.end-vec[depth].end), depth+1))
      {
         return true;
      }
   }
   return getCoca(vec, target, depth+1);
}


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