Lintcode 570 - Find the Missing Number II


Related:
Lintcode 570 - Find the Missing Number II
LeetCode 41 - First Missing Positive
LintCode 196 - Find the Missing Number I
LeetCode 287 - Find the Duplicate Number - Google Interview

https://www.lintcode.com/en/problem/find-the-missing-number-ii/
Giving a string with number from 1-n in random order, but miss 1 number.Find that number.
 Notice
n <= 30
Example
Given n = 20, str = 19201234567891011121314151618
return 17

http://blog.csdn.net/gqk289/article/details/66968192
  1.     int res = 0;  
  2.     boolean found = false;  
  3.     public int findMissing2(int n, String str) {  
  4.         // Write your code here  
  5.         boolean[] cache = new boolean[n + 1];  
  6.         dfs(n, str, 0, cache);  
  7.         return res;  
  8.     }  
  9.     private void dfs(int n, String str, int i, boolean[] cache) {  
  10.         if (i >= str.length() || found) {  
  11.             if (!found) {  
  12.                 for (int j = 0; j <= n; j++) {  
  13.                     if (!cache[j]) {  
  14.                         res = j;  
  15.                     }  
  16.                 }  
  17.                 found = true;  
  18.             }  
  19.             return;  
  20.         }  
  21.         int j = i;  
  22.         int sum = str.charAt(j) - '0';  
  23.         if (sum == 0) {  
  24.             return;  
  25.         }  
  26.         while (sum <= n) {  
  27.             if (!cache[sum]) {  
  28.                 cache[sum] = true;  
  29.                 dfs(n, str, j + 1, cache);  
  30.                 cache[sum] = false;  
  31.             }  
  32.             j++;  
  33.             if (j >= str.length()) {  
  34.                 break;  
  35.             }  
  36.             sum = sum * 10 + (str.charAt(j) - '0');  
  37.         }  
  38.     }  
https://xizha677.gitbooks.io/codenotes/content/find-the-missing-number-ii.html

  • initialize a foundNums boolean array with false value for number from 1 to n.
  • If the first digit is less than n, set it as found in foundNums and check the remaining part.
  • If the first two digits are less than n, set this number as found in foundNums and check the remaining part.
  • Stop when no more digit left, and return the only missing number in foundNums.

  •     private int result = 0;
    
        public int findMissing2(int n, String str) {
            dfs(0, n, str, new boolean[n + 1]);
            return result;
        }
    
        private void dfs(int idx, int n, String str, boolean[] foundNums) {
            if (idx >= str.length()) {
                int count = 0;
                int firstI = 0;
                for (int i = 1; i <= n; i++) {
                    if (!foundNums[i]) {
                        count++;
                        firstI = i;
                    }
    
                }
                if (count == 1) {
                    result = firstI;
                }
                return;
            }
            //one digits
            int num = (int)(str.charAt(idx) - '0');
            if (num <= n && !foundNums[num]) {
                foundNums[num] = true;
                dfs(idx + 1, n, str, foundNums);
                foundNums[num] = false;
            }
    
            //two digits
            if (idx + 1 >= str.length()) {
                return;
            }
            num = num * 10 + (int)(str.charAt(idx + 1) - '0');
            if (num <= n && !foundNums[num]) {
                foundNums[num] = true;
                dfs(idx + 2, n, str, foundNums);
                foundNums[num] = false;
            }
        }
    http://blog.hyoung.me/cn/2017/02/find-the-missing-number/
    严格来说,这个变形题其实已经跟上面的那一道题关系不是很大了,也无法利用到桶排序的方法,具体原因在下面分析。这本质就是一道搜索类的题目,而且需要穷举才能解决,那么就是用 DFS 了。
    具体来说,就是每次从字符串头部选取一个数,如果这个数没有出现过的话,把这个数记录下来,然后继续把剩余的字符串作为子问题继续搜索,直到找到一个可行的组合。最后再去这个组合里面找缺失的数。
    因为有了 n30 这个输入的限制条件,我们其实每次只需考察字符串头部前一位和前两位就可以了。此外,若字符串是以0开头,那么直接返回false就好了。
    http://www.jiuzhang.com/solutions/find-the-missing-number-ii/
        public boolean flag = false;
        public int ans = 0;
        public int findMissing2(int n, String str) {
            boolean[] happen = new boolean[n + 1];
            dfs(0, n, str, happen);
            return ans;
        }
        
        public void dfs(int i, int n, String s, boolean[] happen) {
            if (i >= s.length() || flag) {
             if (!flag)
                for (int k = 1; k <= n; k++) {
                    if (!happen[k]) {
                        ans = k;
                    }
                }
             flag = true;
                return;
            }
            int sum = s.charAt(i) - '0';
            int j = i;
            if (sum == 0) {
                return;
            }
            while (sum <= n) {
                if (!happen[sum]) {
                    happen[sum] = true;
                    dfs(j+1, n, s, happen);
                    happen[sum] = false;
                }
                j++;
                if (j >= s.length()) {
                    break;
                }
                sum = sum * 10 + (s.charAt(j) - '0');
            }
        }
    

    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