LeetCode 961 - N-Repeated Element in Size 2N Array


https://leetcode.com/problems/n-repeated-element-in-size-2n-array/
In a array A of size 2N, there are N+1 unique elements, and exactly one of these elements is repeated N times.
Return the element repeated N times.

    Example 1:
    Input: [1,2,3,3]
    Output: 3
    
    Example 2:
    Input: [2,1,2,5,3,2]
    Output: 2
    
    Example 3:
    Input: [5,1,5,2,5,3,5,4]
    Output: 5
    

    Note:
    1. 4 <= A.length <= 10000
    2. 0 <= A[i] < 10000
    3. A.length is even

    HashSet or repeated number stay within distance 2 or random 4 times


    https://leetcode.com/articles/n-repeated-element-in-size-2n-array/
    If we ever find a repeated element, it must be the answer. Let's call this answer the major element.
    Consider all subarrays of length 4. There must be a major element in at least one such subarray.
    This is because either:
    • There is a major element in a length 2 subarray, or;
    • Every length 2 subarray has exactly 1 major element, which means that a length 4 subarray that begins at a major element will have 2 major elements.
    Thus, we only have to compare elements with their neighbors that are distance 1, 2, or 3 away.

      public int repeatedNTimes(int[] A) {
        for (int k = 1; k <= 3; ++k)
          for (int i = 0; i < A.length - k; ++i)
            if (A[i] == A[i + k])
              return A[i];

        throw null;
      }


    https://leetcode.com/problems/n-repeated-element-in-size-2n-array/discuss/208317/C%2B%2B-2-lines-O(4)-or-O-(1)
    The intuition here is that the repeated numbers have to appear either next to each other (A[i] == A[i + 1]), or alternated (A[i] == A[i + 2]).
    The only exception is sequences like [2, 1, 3, 2]. In this case, the result is the last number, so we just return it in the end. This solution has O(n) runtime.
    int repeatedNTimes(vector<int>& A) {
      for (auto i = 0; i < A.size() - 2; ++i)
        if (A[i] == A[i + 1] || A[i] == A[i + 2]) return A[i];
      return A[A.size() - 1]; 
    }
    
    Another interesting approach is to use randomization (courtesy of @lee215 ). If you pick two numbers randomly, there is a 25% chance you bump into the repeated number. So, in average, we will find the answer in 4 attempts, thus O(4) runtime.
    int repeatedNTimes(vector<int>& A, int i = 0, int j = 0) {
      while (A[i = rand() % A.size()] != A[j = rand() % A.size()] || i == j);
      return A[i];
    }

    https://leetcode.com/problems/n-repeated-element-in-size-2n-array/discuss/208563/JavaC%2B%2BPython-O(1)-Solution
    Check if A[i] == A[i - 1] or A[i] == A[i - 2]
    If so, we return A[i]
    If not, it must be [x, x, y, z] or [x, y, z, x]
    where we miss the check between A[0] and A[1]
    O(N) time O(1) space
        public int repeatedNTimes(int[] A) {
            for (int i = 2; i < A.length; ++i)
                if (A[i] == A[i - 1] || A[i] == A[i - 2])
                    return A[i];
            return A[0];
        }
    https://www.acwing.com/solution/LeetCode/content/671/
        int repeatedNTimes(vector<int>& A) {
            int n = A.size();
            for (int i = 0; i < n; i += 2)
                if (A[i] == A[i + 1])
                    return A[i];

            if (A[0] == A[2] || A[0] == A[3])
                return A[0];

            return A[1];
        }

    https://leetcode.com/problems/n-repeated-element-in-size-2n-array/discuss/208333/Circular-array-O(n)-time-and-O(1)-Space
    If a number is repeated N times in a list of size 2N, it is always possible for the repeated number to stay within a distance of 2.
    Consider this exaple where N = 4, Number x is repeated twice. All possible comibnations for x to fit in a list of size 4 are:
    [a,b,x,x]
    [x,a,b,x] (distance between both the x is still 1, consider it as a circular list)
    [x,a,x,b]
    [x,x,a,b]
    [a,x,b,x]
    [a,x,x,b]
    class Solution:
        def repeatedNTimes(self, A):
            for i in range(len(A)):
                if A[i - 1] == A[i] or A[i - 2] == A[i]:
                    return A[i]

    https://jinx19.github.io/2018/12/23/LeetCode-Solution-2018-12-23-LeetCode-Solution-961-N-Repeated-Element-in-Size-2N-Array%E2%80%9C/
    另外,如果一个数字在一个2N数组中重复N次,那么必然存在,它后面一个数字或者它后面的后面一个数字和它相同,即总存在距离小于2的两个重复数字。
    注意 x _ _ x 这种距离为1.
    比如一个8长度为8的数组,假设 不符合这种条 件,假设距离都为3:
    [x_ _ x_ _x _ _x_ _]
    那么可见还需要插入的数字是 4 * 2 = 8,显然不 符合题意。

    X. random
    Randomly pick two numbers in the array, if they are the same (25% probability) return the number, do it until the two numbers are the same.
    Time complexity: O(1) expected 4
    Space complexity: O(1)
      int repeatedNTimes(vector<int>& A) {
        int i = 0;
        int j = 0;
        while (i == j || A[i] != A[j]) {
          i = rand() % A.size();
          j = rand() % A.size();
        }
        return A[i];
      }

    X. https://zhanghuimeng.github.io/post/leetcode-961-n-repeated-element-in-size-2n-array/
    感觉还是写得有点复杂。不需要用这么多判断。
        int repeatedNTimes(vector<int>& A) {
            for (int i = 0; i < A.size() - 3; i++) {
                if (A[i] == A[i+1] || A[i] == A[i+2] || A[i] == A[i+3]) return A[i];
                if (A[i+1] == A[i+2] || A[i+1] == A[i+3]) return A[i+1];
                if (A[i+2] == A[i+3]) return A[i+2];
            }
            return -1;
        }


      public int repeatedNTimes(int[] A) {
        Map<Integer, Integer> count = new HashMap();
        for (int x : A) {
          count.put(x, count.getOrDefault(x, 0) + 1);
        }

        for (int k : count.keySet())
          if (count.get(k) > 1)
            return k;

        throw null;

      }

    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