LeetCode 915 - Partition Array into Disjoint Intervals


https://leetcode.com/problems/partition-array-into-disjoint-intervals/
Given an array A, partition it into two (contiguous) subarrays left and right so that:
  • Every element in left is less than or equal to every element in right.
  • left and right are non-empty.
  • left has the smallest possible size.
Return the length of left after such a partitioning.  It is guaranteed that such a partitioning exists.

Example 1:
Input: [5,0,3,8,6]
Output: 3
Explanation: left = [5,0,3], right = [8,6]
Example 2:
Input: [1,1,1,0,6,12]
Output: 4
Explanation: left = [1,1,1,0], right = [6,12]
X.
https://leetcode.com/problems/partition-array-into-disjoint-intervals/discuss/175907/O(n)-One-Pass-Solution


endIndex is the leftmost index of left part
maxIndex is max number's we encountered so far
maxCurrIndex is the max number's index in the left part
    public int PartitionDisjoint(int[] A) {
        
        int maxCurrIndex = 0;
        int maxIndex = 0;
        int endIndex = 0;
        
        
        for(int i=1;i<A.Length;i++){
            
            if(A[i] < A[maxCurrIndex]){
                maxCurrIndex = maxIndex;
                endIndex = i;
            }else if(A[i] > A[maxIndex]){
                maxIndex = i;
            }
            
        }
        return endIndex+1;
        
    }

by maintaining two variables prevMax & curMax

https://leetcode.com/problems/partition-array-into-disjoint-intervals/discuss/177339/Java-simple-solution-O(n)-time-and-O(1)-space-by-maintaining-two-variables-prevMax-and-curMax


(1)开辟两个变量leftMax, rightMax 分别表示分割线左边区间的最大值,以及当前数组的最大值。然后,从左向右扫描数组。

(2)如果扫描的当前值小于leftMax,很显然此时的分割线需要更新,因为右区间所有值都应该大于左区间的所有值。在更新分割线res时,同时也要更新leftMax,获取左区间的最大值。并且重置 rightMax 。

(3)如果扫描的当前值大于或等于 leftMax,就接着判断与 rightMax 的大小关系,如果大于 rightMax ,就更新 rightMax 。直接到结束,就可以得出结果。
https://zxi.mytechroad.com/blog/greedy/leetcode-915-partition-array-into-disjoint-intervals/
  int partitionDisjoint(vector<int>& A) {    
    int left_max = A[0];
    int cur_max = A[0];
    int left_len = 1;
    for (int i = 1; i < A.size(); ++i) {
      if (A[i] < left_max) {
        left_max = cur_max;
        left_len = i + 1;        
      } else {
        cur_max = max(cur_max, A[i]);
      }
    }
    return left_len;
  }

X. O(1) space
https://leetcode.com/problems/partition-array-into-disjoint-intervals/discuss/175945/Java-one-pass-7-lines


public int partitionDisjoint(int[] a) {
        int localMax = a[0], partitionIdx = 0, max = localMax;
        for (int i = 1; i < a.length; i++)
            if (localMax > a[i]) {
                localMax = max;
                partitionIdx = i;
            } else max = Math.max(max, a[i]);
        return partitionIdx + 1;
    }



public int partitionDisjoint(int[] A) {

  int[] mins = new int[A.length];

  mins[A.length - 1] = A[A.length - 1];
  for (int i = A.length - 2; i >= 0; i--) {
    mins[i] = Math.min(A[i], mins[i + 1]);
  }

  int maxValue = A[0];
  for (int i = 1; i < A.length; i++) {

    if (maxValue <= mins[i])
      return i;
    else
      maxValue = Math.max(maxValue, A[i]);
  }

  return A.length;

}
https://leetcode.com/problems/partition-array-into-disjoint-intervals/discuss/175849/C%2B%2BJavaPython-Straight-Forward


B[i] stands for the minimum value in subarray A[i], A[i+1], ..., A[n-1]
pmax stands for the prefix maximum of i first values in A.
return the smallest that i that pmax <= B[i]


    public int partitionDisjoint(int[] A) {
        int n = A.length, pmax = 0, B[] = new int[n];
        B[n - 1] = A[n - 1];
        for (int i = n - 2; i > 0; --i)
            B[i] = Math.min(A[i], B[i + 1]);
        for (int i = 1; i < n; ++i) {
            pmax = Math.max(pmax, A[i - 1]);
            if (pmax <= B[i]) return i;
        }
        return n;
    }

Approach 1: Next Array
Instead of checking whether all(L <= R for L in left for R in right), let's check whether max(left) <= min(right).
Algorithm
Let's try to find max(left) for subarrays left = A[:1], left = A[:2], left = A[:3], ... etc. Specifically, maxleft[i] will be the maximum of subarray A[:i]. They are related to each other: max(A[:4]) = max(max(A[:3]), A[3]), so maxleft[4] = max(maxleft[3], A[3]).
Similarly, min(right) for every possible right can be found in linear time.
After we have a way to query max(left) and min(right) quickly, the solution is straightforward.
  public int partitionDisjoint(int[] A) {
    int N = A.length;
    int[] maxleft = new int[N];
    int[] minright = new int[N];

    int m = A[0];
    for (int i = 0; i < N; ++i) {
      m = Math.max(m, A[i]);
      maxleft[i] = m;
    }

    m = A[N - 1];
    for (int i = N - 1; i >= 0; --i) {
      m = Math.min(m, A[i]);
      minright[i] = m;
    }

    for (int i = 1; i < N; ++i)
      if (maxleft[i - 1] <= minright[i])
        return i;

    throw null;
  }

X. https://zxi.mytechroad.com/blog/greedy/leetcode-915-partition-array-into-disjoint-intervals/
  int partitionDisjoint(vector<int>& A) {
    multiset<int> s(begin(A) + 1, end(A));
    int left_max = A[0];
    for (int i = 1; i < A.size(); ++i) {      
      if (*begin(s) >= left_max) return i;
      s.erase(s.equal_range(A[i]).first);
      left_max = max(left_max, A[i]);      
    }
    return -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