×

String Coding Problems

Arrays Coding Problems

Sorting Coding Problems

Searching Coding Problems

Coding Algorithms

Tree Coding Problems

Stack Coding Problems

Linked list Coding Problems

Graph Coding Problems

Greedy Algorithms Coding Problems

Dynamic Programming Coding Problems

Matrix Coding Problems

Recursion Coding Problems

Number Theory Coding Problems

Backtracking Coding Problems

Heap Coding Problems

Brute Force Coding Problems

Implementation Coding Problems

Google Contests

Competitive Programming Coding

Miscellaneous

Count of Subarrays

Count of Subarrays: In this article, we are going to see how to find a valid number of subarrays based on some constraints? It's a very common interview problem often asked in interview s of Amazon. Flipkart.
Submitted by Radib Kar, on June 12, 2020

Problem statement

Given an array of N positive integers a1, a2,  ..., an. The value of each contiguous subarray of a given array is the maximum element present in that subarray. The task is to return the number of subarrays having value strictly greater than K.

Input

The first line contains two space-separated positive integers N and K denoting the size of the array and the value of K. The second line contains N space-separated positive integers denoting the elements of the array.

Output

Output the number of subarrays having value strictly greater than K.

Constraints:

1 <= T <= 50
1 <= N <= 100
1 <= a[i] <= 105

Example:

Test case: 1

Input: 
5 3
3 4 5 2 7

Output:
13

Test case: 2
4 1
1 2 3 4

Output:
9

Explanation:

Test case 1: 
All possible subarrays are listed below 
with their respective value (maximum in the subarray)

3 -> 3
4 -> 4
5 -> 5
2 -> 2
7 -> 7
3, 4 -> 4
4, 5 -> 5
5, 2 -> 5
2, 7 -> 7
3, 4, 5 -> 5
4, 5, 2 -> 5
5, 2, 7 -> 7
3, 4, 5, 2 -> 5
4, 5, 2, 7 -> 7
3, 4, 5, 2, 7 -> 7

So, number of valid subarrays is 13

Solution Approach

  1. Create dp[n][n] to store value (maximum) of subarray;
  2. Initialize count = 0 which will be our final result;
  3. Base case computation (single length subarrays),
    for i=0 to n
        // since only one element in single length subarray, 
        // just check for that element
        if(a[i]>k) 
            dp[i][i]=a[i];
            count++;
        else
            dp[i][i]=-1; // or arr[i] itslef
    end for
    
  4. Computing all length subarray cases,
    for subarray length,len=2 to n
        for start=0 to n-len
            end=start+len-1; // last element of subarray
            if(a[end]>k || dp[start][end-1]>k)
                dp[start][end]=std::max(a[end],dp[start][end-1]);
                count++;
            else
                dp[start][end]=-1;  
        end for
    end for
    

Okay, so the strategy is to compute for subarray a[start..end] with help of already computed one a[start..end-1].

Subarray a[start..end] will only make a count if a[start..end-1] already makes a count ( yes because, it's part of the subarray so, anything max in it would be max in the parent one too) Or if a[end]>k.

In both the cases maximum of the subarray, a[start..end] is greater than K

That's what we have done.

Below is illustration for our test case 1,

Input array: [3, 4, 5, 2, 7] and K=3.

So, let's compute the basic test case first

We need a 5X5 DP array for this

Count of subarrays (1)

Starting to compute for other values.

Len=2

Start=0, end=1

Count of subarrays (2)

Start=1, end=2

Count of subarrays (3)

Start=2, end=3

Count of subarrays (4)

Start=3, end=4

Count of subarrays (5)

Len=3

Start=0, end=2

Count of subarrays (6)

Start=1, end=3

Count of subarrays (7)

Start=2, end=4

Count of subarrays (8)

Len=4

Start=0, end=3

Count of subarrays (9)

Start=1, end=4

Count of subarrays (10)

Len=5

Start=0, end=3

Count of subarrays (11)

Done!

Count is 13 (count of positive values in the array).

C++ Implementation

#include <bits/stdc++.h>
using namespace std;

int maximum(int a, int b)
{
    return (a > b) ? a : b;
}

int subArray(vector<int> a, int n, int k)
{

    int dp[n][n];
    int count = 0;
    for (int i = 0; i < n; i++) {
        if (a[i] > k) {
            dp[i][i] = a[i];
            count++;
        }
        else
            dp[i][i] = -1; //or arr[i] itslef
    }

    for (int len = 2; len <= n; len++) {
        for (int start = 0; start <= n - len; start++) {
            int end = start + len - 1;
            if (a[end] > k || dp[start][end - 1] > k) {
                dp[start][end] = std::max(a[end], dp[start][end - 1]);
                count++;
            }
            else
                dp[start][end] = -1;
        }
    }

    return count;
}

int main()
{
    int n, item, k;

    cout << "Input size of array\n";
    cin >> n;
    
    cout << "Input k\n";
    cin >> k;
    
    cout << "Add the array elements\n";
    vector<int> a;
    
    for (int j = 0; j < n; j++) {
        scanf("%d", &item);
        a.push_back(item);
    }

    cout << "Total count of valid subarray is " << subArray(a, n, k) << endl;

    return 0;
}

Output

Input size of array
5
Input k
3
Add the array elements
3 4 5 2 7
Total count of valid subarray is 13


Comments and Discussions!

Load comments ↻





Copyright © 2024 www.includehelp.com. All rights reserved.