LeetCode 795 - Number of Subarrays with Bounded Maximum


https://leetcode.com/problems/number-of-subarrays-with-bounded-maximum/description/
We are given an array A of positive integers, and two positive integers L and R (L <= R).
Return the number of (contiguous, non-empty) subarrays such that the value of the maximum array element in that subarray is at least L and at most R.
Example :
Input: 
A = [2, 1, 4, 3]
L = 2
R = 3
Output: 3
Explanation: There are three subarrays that meet the requirements: [2], [2, 1], [3].
Note:
  • L, R  and A[i] will be an integer in the range [0, 10^9].
  • The length of A will be in the range of [1, 50000].
One pass:
http://zxi.mytechroad.com/blog/algorithms/array/leetcode-795-number-of-subarrays-with-bounded-maximum/
  int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
    int ans = 0;
    int left = -1;
    int right = -1;
    for (int i = 0; i < A.size(); ++i) {
      if (A[i] >= L) right = i;
      if (A[i] > R) left = i;      
      ans += (right - left);
    }
    return ans;
  }
https://blog.csdn.net/u014688145/article/details/79457423
先关注一波性质,在L和R之间的最大值val符合 val in [L, R], 可以转为:求区间内的任意值x , x in [L, R]。所以,把数组的每个位置当作起点,如A = [2, 1, 4, 3]:
位置0: [2], [2, 1], [2, 1, 4], [2, 1, 4, 3]
位置1: [1], [1, 4], [1, 4, 3]
位置2: [4], [4, 3]
位置3: [3]

for each subset in each position:
calculate whether the last value in subset <= R

你会发现,考虑位置0,subset[2, 1, 4]中的last value 4时,因为4 > R,所以删除该subset,且连同位置123中包含4的子集可以一并删除。

      int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
        return count(A, R) - count(A, L - 1);
      }
    private:
      // Count # of sub arrays whose max element is <= N
      int count(const vector<int>& A, int N) {
        int ans = 0;
        int cur = 0;
        for (int a: A) {
          if (a <= N)
            ans += ++cur;
          else
            cur = 0;
        }
        return ans;
      }
    https://leetcode.com/problems/number-of-subarrays-with-bounded-maximum/discuss/117616/C++-O(n)-less10-lines
    left+1..right is the longest subarray so far that has an ending number (A[right]) in range L..R.
    When A[i] > R, the update ensures this interval becomes empty again so the update to result can be handled uniformly in all situations.
    The initial case: we don't have some A[right] in range L..R yet, so it's also empty.
        int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
            int result=0, left=-1, right=-1;
            for (int i=0; i<A.size(); i++) {
                if (A[i]>R) left=i;
                if (A[i]>=L) right=i;
                result+=right-left;
            }
            return result;
        }
    

    https://leetcode.com/problems/number-of-subarrays-with-bounded-maximum/discuss/117612/C++-O(n)-solution-with-explanations/117551?page=1
    https://blog.csdn.net/u011026968/article/details/79475331
    The idea is to keep track of 3 things while iterating: the number of valid subarrays (res), the number of valid subarray starting points (heads), and the number of not-yet valid starting points (tails).
    • Values between L and R are heads. Every contiguous value afterwards that is less than R afterwards can extend them, creating new subarrays.
    • Values less than L are tails. If they connect to a head later in the array, they become a head for valid subarrays.
    • Values greater than R are combo breakers. They stop all heads and tails from forming from subarrays.
    Therefore, we keep a rolling count of valid subarrays as we iterate through A, the main array.
    • If a head is encountered, it joins the existing heads to form subarrays at each iteration. All tails are promoted to heads. All existing heads create a new valid subarray.
      • The new head creates subarray of a single element ([head])
      • Each promoted head creates subarrays from its tail index to current index (e.g. [tail1, tail2, head, ...], encountering head promotes tail1 and tail2 to heads and creates [tail1, tail2, head] and [tail2, head])
    • If a tail is encountered, all existing heads can create another subarray with it. The tail remains useless until it encounters a head (see above).
    • If a combo breaker is met, all existing heads and tails become useless, and are reset to 0.
    Counts of new subarrays (i.e. head count) are added to res at each iteration, if valid.
        int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
            int res = 0, heads = 0, tails = 0;
            for (int val : A) {
                if (L <= val && val <= R) {
                    // val is a head. All tails promoted to heads
                    heads+= tails + 1;
                    tails = 0;
                    res += heads;
                }
                else if (val < L) {
                    // val is a tail, can extend existing subarrays
                    tails++;
                    res += heads;
                }
                else {
                    // combo breaker
                    heads = 0;
                    tails = 0;
                }
            }
            return res;
        }
    https://leetcode.com/problems/number-of-subarrays-with-bounded-maximum/discuss/117723/Python-standard-DP-solution-with-explanation

    http://bookshadow.com/weblog/2018/03/04/leetcode-number-of-subarrays-with-bounded-maximum/
    组合(Combination)
    在A中找出所有大于R的整数,将这些整数消去,并将A分为若干个子数组
    
    对于上一步得到的任意数组a,从左向右找出所有不小于L的整数
    
    假设某个这样的整数为x,下标为i;记该整数左侧相邻的不小于L的整数y的下标为j
    
    则所有包含整数x的连续子序列个数为:(i - j) * (len(A) - i)
    def numSubarrayBoundedMax(self, A, L, R): """ :type A: List[int] :type L: int :type R: int :rtype: int """ ans = lastIdx = 0 for i, x in enumerate(A + [10**10]): if x > R: ans += self.numSubarrayMinimumMax(A[lastIdx:i], L) lastIdx = i + 1 return ans def numSubarrayMinimumMax(self, A, L): """ :type A: List[int] :type L: int :rtype: int """ ans = lastIdx = 0 for i, x in enumerate(A): if x >= L: ans += (i - lastIdx + 1) * (len(A) - i) lastIdx = i + 1 return ans

    O(N^2)
    https://leetcode.com/problems/number-of-subarrays-with-bounded-maximum/discuss/117585/Java-9-liner
        public int numSubarrayBoundedMax(int[] A, int L, int R) {
            int res = 0;
            for (int i = 0; i < A.length; i++) {
                if (A[i] > R) continue;
                int max = Integer.MIN_VALUE;
                for (int j = i; j < A.length; j++) {
                    max = Math.max(max, A[j]);
                    if (max > R) break;
                    if (max >= L) res++;
                }
            }
            return res;
        }
    


    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