Queries for counts of array elements with values in given range

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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// Simple C++ program to count number of elements
// with values in given range.
#include <iostream>
using namespace std;
  
// function to count elements within given range
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
int 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python

filter_none

edit
close

play_arrow

link
brightness_4
code

# function to count elements within given range
def 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 function
arr = [1, 3, 4, 9, 10, 3]
n = len(arr)
  
# Answer queries
i = 1
j = 4
print(countInRange(arr, n, i, j))
i = 9
j = 12
print(countInRange(arr, n, i, j))

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// Simple PHP 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
    $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
?>

chevron_right


Output:

4
2

 

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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 >= x
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
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
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
int 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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.

chevron_right


Python

filter_none

edit
close

play_arrow

link
brightness_4
code

# function to find first index >= x
def 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 <= x
def 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 range
def countInRange(arr, n, x, y):
  # initialize result
  count = 0;
  count = upperIndex(arr, n, y) - lowerIndex(arr, n, x) + 1;
  return count
  
# driver function
arr = [1, 3, 4, 9, 10, 3]
  
# Preprocess array
arr.sort()
n = len(arr)
  
# Answer queries
i = 1
j = 4
print(countInRange(arr, n, i, j))
i = 9
j = 12
print(countInRange(arr, n, i, j))

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// Efficient PHP program to count 
// number of elements with values 
// in given range. 
  
// function to find first index >= x 
function 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 <= y 
function 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 range 
function 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 array 
sort($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
?>

chevron_right



Output:

4
2

This article is contributed by Aditi Sharma. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@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.



My Personal Notes arrow_drop_up