Google – Toggle Problem


Google – Toggle Problem
类似开关灯泡的题。要求实现
isToggled(long idx)
toggle(long start, long end)
这题难点在于有无限数量的灯泡,所以不能另开数据结构来存每个灯泡的状态。
[Solution]
[Solution #1]
Merge Interval
维护一个sorted list of interval表示已经toggled的灯泡。每次call toggle(start, end), 就生成一个新的Inveral [start, end], 扫描整个list,把和新interval重叠的部分删掉,把没有重叠的部分加进sorted list就可以了。
Query的时候就看idx是不是在list里面。
Pros: Query time O(k), where k is the number of toggled bubbles.
Cons: A little bit hard to implement
[Solution #2]
Bit Manipulation
因为这道题说了是无限量的灯泡,所以bit manipulation其实没法解。但是如果数量有限且在可接受范围之内的话,bit manipulation是个不错的解法。就有几个灯泡就开几个bit然后toggle就好了。时间空间复杂度都还可以。
[Solution #3]
Interval Tree
Interval Tree是一个BST, 每个node是记录一个range [low, high],BST结构根据low来维护。除了记录range,每个node还记录一个maxValue表示以该结点为root的整个subtree的最大high值。
Insert node的时候不需要像segment tree那样考虑partial overlap的情况,如果不是complete overlap, 都作为一个新的node加入到bst,沿路更新每个node的maxValue就好了。
那么这道题就是维护一个interval tree, 每次call toggle()就加入新node,query的时候就计算包含idx的node有多少个。
class Solution {
   
  ITNode root;
   
  public boolean isToggled(long idx) {
    int[] count = {0};
    dfs(root, count, idx);
    return count[0] % 2 != 0;
  }
   
  private void dfs(ITNode root, int[] count, long idx) {
    if (root == null) {
      return;
    }
     
    if (root.interval.low <= idx && idx <= root.interval.high) {
      count[0]++;
    }
    dfs(root.left, count, idx);
    dfs(root.right, count, idx);
  }
   
  public void toggle(long start, long end) {
    if (root == null) {
      root = new ITNode(new Interval(start, end));
    }
    else {
      insert(root, new Interval(start, end));
    }
  }
   
  private ITNode insert(ITNode root, Interval interval) {
    if (root == null) {
      return new ITNode(interval);
    }
    if (interval.low < root.interval.low) {
      root.left = insert(root.left, interval);
    }
    else {
      root.right = insert(root.right, interval);
    }
  }
   
  private class ITNode {
    Interval interval;
     
    ITNode left;
    ITNode right;
     
    ITNode(Interval interval) {
      this.interval = interval;
    }
  }
   
  private class Interval {
    long low;
    long high;
     
    Interval(long low, long high) {
      this.low = low;
      this.high = high;
    }
  }
   
}
https://instant.1point3acres.com/thread/130512
有一排数量无限的object,每个object有两个状态,可以用true和false来表示,object的状态是可切换的,初始情况下所有object的状态都是false。让你设计一个class,实现两个方法:isToggled(long idx), toggle(long start, long end)。这题没记错的话之前面经里也出现过。我最后给出的方法是维护一个list of intervals, 每次执行toggle时都要新加入一个新interval,然后把这个新interval merge进已有的interval list里面,这个解法的问题在于实现起来非常复杂,因为做merge操作时你需要反转所有和新interval重叠的interval的状态,最后才把新interval里不重叠的部分加进list里面。最后代码也没写完,

但是写到中间我突然想起来之前看到一个面经里的比较类似的题,可以只记录每个object的toggle操作的次数,最后根据操作次数的奇偶来判断object的状态,如此一来就不需要实际记录状态,只需要维护一个balanced interval tree,每次toggle就把新interval加进tree里,执行isToggled(long idx)时计算所有包含给定idx的interval的数量就能决定对应的object的状态了。跟面试官提了提这个做法,面试官表示这就是他的解法,但是他觉得我给的解法也不错,查询的复杂度要比他的方法低,就是难实现。

https://github.com/UmassJin/Leetcode/blob/master/Experience/google面经集合.py
不,面试官就是期待我提出这样的解法,他也说了如果写对应的代码的话不需要实现balanced interval tree,假设有这么个现成的数据结构给你用就行了。
因为interval tree不难写,但是balanced的就没那么好写了。。

Read full article from Google – Toggle Problem

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