Queries for counts of array elements with values in given range

09 Jun, 2022
Given an unsorted array of size n, find no of elements between two elements i and j (both inclusive).Examples:  
Input :  arr = [1 3 3 9 10 4] 
         i1 = 1, j1 = 4
         i2 = 9, j2 = 12
Output : 4
         2
The numbers are: 1 3 3 4 for first query
The numbers are: 9 10 for second query
Source: Amazon Interview Experience 
A simple approach will be to run a for loop to check if each element is in the given range and maintain their count. Time complexity for running each query will be O(n). 
C++
Java
Python3
C#
PHP
Javascript
// Simple C++ program to count number of elements// with values in given range.#include <bits/stdc++.h>using namespace std; // function to count elements within given rangeint countInRange(int arr[], int n, int x, int y){    // initialize result    int count = 0;    for (int i = 0; i < n; i++) {         // check if element is in range        if (arr[i] >= x && arr[i] <= y)            count++;    }    return count;} // driver functionint main(){    int arr[] = { 1, 3, 4, 9, 10, 3 };    int n = sizeof(arr) / sizeof(arr[0]);     // Answer queries    int i = 1, j = 4;    cout << countInRange(arr, n, i, j) << endl;     i = 9, j = 12;    cout << countInRange(arr, n, i, j) << endl;    return 0;}
// Simple java program to count// number of elements with// values in given range.import java.io.*; class GFG{    // function to count elements within given range    static int countInRange(int arr[], int n, int x, int y)    {        // initialize result        int count = 0;        for (int i = 0; i < n; i++) {                 // check if element is in range            if (arr[i] >= x && arr[i] <= y)                count++;        }        return count;    }     // driver function    public static void main (String[] args)    {        int arr[] = { 1, 3, 4, 9, 10, 3 };        int n = arr.length;         // Answer queries        int i = 1, j = 4;        System.out.println ( countInRange(arr, n, i, j)) ;             i = 9;        j = 12;        System.out.println ( countInRange(arr, n, i, j)) ;                      }} // This article is contributed by vt_m
# function to count elements within given rangedef countInRange(arr, n, x, y):     # initialize result    count = 0;     for i in range(n):         # check if element is in range        if (arr[i] >= x and arr[i] <= y):            count += 1    return count # driver functionarr = [1, 3, 4, 9, 10, 3]n = len(arr) # Answer queriesi = 1j = 4print(countInRange(arr, n, i, j))i = 9j = 12print(countInRange(arr, n, i, j))
// Simple C# program to count// number of elements with// values in given range.using System; class GFG  {         // function to count elements    // within given range    static int countInRange(int []arr, int n,                            int x, int y)    {                 // initialize result        int count = 0;        for (int i = 0; i < n; i++) {                 // check if element is in range            if (arr[i] >= x && arr[i] <= y)                count++;        }        return count;    }     // Driver Code    public static void Main ()    {        int[]arr = {1, 3, 4, 9, 10, 3};        int n = arr.Length;         // Answer queries        int i = 1, j = 4;        Console.WriteLine( countInRange(arr, n, i, j)) ;             i = 9;        j = 12;        Console.WriteLine( countInRange(arr, n, i, j)) ;                      }} // This code is contributed by vt_m.
<?php// Simple PHP program to count// number of elements with// values in given range. // function to count elements// within given rangefunction countInRange($arr, $n,                        $x, $y){         // initialize result    $count = 0;    for ($i = 0; $i < $n; $i++)    {         // check if element is in range        if ($arr[$i] >= $x &&            $arr[$i] <= $y)            $count++;    }    return $count;}     // Driver Code    $arr = array(1, 3, 4, 9, 10, 3);    $n = count($arr);     // Answer queries    $i = 1;    $j = 4;    echo countInRange($arr, $n, $i, $j)."\n";     $i = 9;    $j = 12;    echo countInRange($arr, $n, $i, $j)."\n";     // This code is contributed by Sam007?>
<script>     // Simple JavaScript program to count    // number of elements with    // values in given range.         // function to count elements    // within given range    function countInRange(arr, n, x, y)    {                   // initialize result        let count = 0;        for (let i = 0; i < n; i++) {                   // check if element is in range            if (arr[i] >= x && arr[i] <= y)                count++;        }        return count;    }         let arr = [1, 3, 4, 9, 10, 3];    let n = arr.length;     // Answer queries    let i = 1, j = 4;    document.write( countInRange(arr, n, i, j) + "</br>") ;     i = 9;    j = 12;    document.write( countInRange(arr, n, i, j)) ;     </script>
Output:  
4
2
Time Complexity: O(n),Auxiliary Space: O(1)
An Efficient Approach will be to first sort the array and then using a modified binary search function find two indices, one of first element greater than or equal to lower bound of range and the other of the last element less than or equal to upperbound. Time for running each query will be O(logn) and for sorting the array once will be O(nlogn). 
C++
Java
Python3
C#
PHP
Javascript
// Efficient C++ program to count number of elements// with values in given range.#include <bits/stdc++.h>using namespace std; // function to find first index >= xint lowerIndex(int arr[], int n, int x){    int l = 0, h = n - 1;    while (l <= h) {        int mid = (l + h) / 2;        if (arr[mid] >= x)            h = mid - 1;        else            l = mid + 1;    }    return l;} // function to find last index <= yint upperIndex(int arr[], int n, int y){    int l = 0, h = n - 1;    while (l <= h) {        int mid = (l + h) / 2;        if (arr[mid] <= y)            l = mid + 1;        else            h = mid - 1;    }    return h;} // function to count elements within given rangeint countInRange(int arr[], int n, int x, int y){    // initialize result    int count = 0;    count = upperIndex(arr, n, y) - lowerIndex(arr, n, x) + 1;    return count;} // driver functionint main(){    int arr[] = { 1, 4, 4, 9, 10, 3 };    int n = sizeof(arr) / sizeof(arr[0]);     // Preprocess array    sort(arr, arr + n);     // Answer queries    int i = 1, j = 4;    cout << countInRange(arr, n, i, j) << endl;     i = 9, j = 12;    cout << countInRange(arr, n, i, j) << endl;    return 0;}
// Efficient C++ program to count number// of elements with values in given range.import java.io.*;import java.util.Arrays; class GFG{    // function to find first index >= x    static int lowerIndex(int arr[], int n, int x)    {        int l = 0, h = n - 1;        while (l <= h)        {            int mid = (l + h) / 2;            if (arr[mid] >= x)                h = mid - 1;            else                l = mid + 1;        }        return l;    }         // function to find last index <= y    static int upperIndex(int arr[], int n, int y)    {        int l = 0, h = n - 1;        while (l <= h)        {            int mid = (l + h) / 2;            if (arr[mid] <= y)                l = mid + 1;            else                h = mid - 1;        }        return h;    }         // function to count elements within given range    static int countInRange(int arr[], int n, int x, int y)    {        // initialize result        int count = 0;        count = upperIndex(arr, n, y) -                lowerIndex(arr, n, x) + 1;        return count;    }         // Driver function    public static void main (String[] args)    {        int arr[] = { 1, 4, 4, 9, 10, 3 };        int n = arr.length;             // Preprocess array        Arrays.sort(arr);             // Answer queries        int i = 1, j = 4;        System.out.println( countInRange(arr, n, i, j)); ;             i = 9;        j = 12;        System.out.println( countInRange(arr, n, i, j));          }} // This article is contributed by vt_m.
# function to find first index >= xdef lowerIndex(arr, n, x):  l = 0  h = n-1  while (l <= h):    mid = int((l + h)//2)    if (arr[mid] >= x):      h = mid - 1    else:      l = mid + 1  return l  # function to find last index <= xdef upperIndex(arr, n, x):  l = 0  h = n-1  while (l <= h):    mid = int((l + h)//2)    if (arr[mid] <= x):      l = mid + 1    else:      h = mid - 1  return h  # function to count elements within given rangedef countInRange(arr, n, x, y):  # initialize result  count = 0;  count = upperIndex(arr, n, y) - lowerIndex(arr, n, x) + 1;  return count # driver functionarr = [1, 3, 4, 9, 10, 3] # Preprocess arrayarr.sort()n = len(arr) # Answer queriesi = 1j = 4print(countInRange(arr, n, i, j))i = 9j = 12print(countInRange(arr, n, i, j))
// Efficient C# program to count number// of elements with values in given range.using System; class GFG{         // function to find first index >= x    static int lowerIndex(int []arr, int n,                          int x)    {                 int l = 0, h = n - 1;        while (l <= h)        {            int mid = (l + h) / 2;            if (arr[mid] >= x)                h = mid - 1;            else                l = mid + 1;        }        return l;    }         // function to find last index <= y    static int upperIndex(int []arr, int n,                          int y)    {        int l = 0, h = n - 1;        while (l <= h)        {            int mid = (l + h) / 2;            if (arr[mid] <= y)                l = mid + 1;            else                h = mid - 1;        }        return h;    }         // function to count elements    // within given range    static int countInRange(int []arr, int n,                            int x, int y)    {                 // initialize result        int count = 0;        count = upperIndex(arr, n, y) -                lowerIndex(arr, n, x) + 1;        return count;    }         // Driver code    public static void Main ()    {        int []arr = {1, 4, 4, 9, 10, 3};        int n = arr.Length;             // Preprocess array        Array.Sort(arr);             // Answer queries        int i = 1, j = 4;        Console.WriteLine(countInRange(arr, n, i, j)); ;             i = 9;        j = 12;        Console.WriteLine(countInRange(arr, n, i, j));          }} // This code is contributed by vt_m.
<?php// Efficient PHP program to count// number of elements with values// in given range. // function to find first index >= xfunction lowerIndex($arr, $n, $x){    $l = 0; $h = $n - 1;    while ($l <= $h)    {        $mid = ($l + $h) / 2;        if ($arr[$mid] >= $x)            $h = $mid - 1;        else            $l = $mid + 1;    }    return $l;} // function to find last index <= yfunction upperIndex($arr, $n, $y){    $l = 0; $h = $n - 1;    while ($l <= $h)    {        $mid = ($l + $h) / 2;        if ($arr[$mid] <= $y)            $l = $mid + 1;        else            $h = $mid - 1;    }    return $h;} // function to count elements// within given rangefunction countInRange($arr, $n, $x, $y){    // initialize result    $count = 0;    $count = (upperIndex($arr, $n, $y) -              lowerIndex($arr, $n, $x) + 1);    $t = floor($count);    return $t;} // Driver Code $arr = array( 1, 4, 4, 9, 10, 3 );$n = sizeof($arr); // Preprocess arraysort($arr); // Answer queries$i = 1; $j = 4;echo countInRange($arr, $n, $i, $j), "\n"; $i = 9; $j = 12;echo countInRange($arr, $n, $i, $j), "\n"; // This code is contributed by Sachin?>
<script>     // Efficient Javascript program to count number    // of elements with values in given range.         // function to find first index >= x    function lowerIndex(arr, n, x)    {                   let l = 0, h = n - 1;        while (l <= h)        {            let mid = parseInt((l + h) / 2, 10);            if (arr[mid] >= x)                h = mid - 1;            else                l = mid + 1;        }        return l;    }           // function to find last index <= y    function upperIndex(arr, n, y)    {        let l = 0, h = n - 1;        while (l <= h)        {            let mid = parseInt((l + h) / 2, 10);            if (arr[mid] <= y)                l = mid + 1;            else                h = mid - 1;        }        return h;    }           // function to count elements    // within given range    function countInRange(arr, n, x, y)    {                   // initialize result        let count = 0;        count = upperIndex(arr, n, y) -                lowerIndex(arr, n, x) + 1;        return count;    }         let arr = [1, 4, 4, 9, 10, 3];    let n = arr.length;     // Preprocess array    arr.sort(function(a, b){return a - b});     // Answer queries    let i = 1, j = 4;    document.write(countInRange(arr, n, i, j) + "</br>"); ;     i = 9;    j = 12;    document.write(countInRange(arr, n, i, j));     </script>
Output:  
4
2
Time Complexity: O(n log n),Auxiliary Space: O(1)
This article is contributed by Aditi Sharma. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
vt_m
Sam007
Sach_Code
Shivam Mohan
suresh07
divyeshrabadiya07
amartyaghoshgfg
sachinvinod1904
Amazon
array-range-queries
Binary Search
Arrays
Amazon
Arrays
Binary Search
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum and minimum of an array using minimum number of comparisons
Top 50 Array Coding Problems for Interviews
Multidimensional Arrays in Java
Stack Data Structure (Introduction and Program)
Linear Search
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Introduction to Arrays
K'th Smallest/Largest Element in Unsorted Array | Set 1
Subset Sum Problem | DP-25
Introduction to Data Structures