Related Articles

Related Articles

Minimum index i such that all the elements from index i to given index are equal
  • Last Updated : 27 Nov, 2020

Given an array arr[] of integers and an integer pos, the task is to find the minimum index i such that all the elements from index i to index pos are equal.

Examples: 

Input: arr[] = {2, 1, 1, 1, 5, 2}, pos = 3 
Output:
Elements in index range [1, 3] are all equal to 1.
Input: arr[] = {2, 1, 1, 1, 5, 2}, pos = 5 
Output:
 

Simple Approach: Starting from index pos – 1, traverse the array in reverse and for the first index i such that arr[i] != arr[pos] print i + 1 which is the required index.

Below is the implementation of the above approach: 



C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the minimum required index
int minIndex(int arr[], int n, int pos)
{
    int num = arr[pos];
 
    // Start from arr[pos - 1]
    int i = pos - 1;
    while (i >= 0) {
        if (arr[i] != num)
            break;
        i--;
    }
 
    // All elements are equal
    // from arr[i + 1] to arr[pos]
    return i + 1;
}
 
// Driver code
int main()
{
    int arr[] = { 2, 1, 1, 1, 5, 2 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int pos = 4;
     
      // Function Call
    cout << minIndex(arr, n, pos);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
class GFG {
 
    // Function to return the minimum required index
    static int minIndex(int arr[], int n, int pos)
    {
        int num = arr[pos];
 
        // Start from arr[pos - 1]
        int i = pos - 1;
        while (i >= 0) {
            if (arr[i] != num)
                break;
            i--;
        }
 
        // All elements are equal
        // from arr[i + 1] to arr[pos]
        return i + 1;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = { 2, 1, 1, 1, 5, 2 };
        int n = arr.length;
        int pos = 4;
         
          // Function Call
        System.out.println(minIndex(arr, n, pos));
    }
}
 
// This code is contributed by Code_Mech.

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach
 
# Function to return the minimum
# required index
def minIndex(arr, n, pos):
 
    num = arr[pos]
 
    # Start from arr[pos - 1]
    i = pos - 1
    while (i >= 0):
        if (arr[i] != num):
            break
        i -= 1
     
    # All elements are equal
    # from arr[i + 1] to arr[pos]
    return i + 1
 
# Driver code
arr = [2, 1, 1, 1, 5, 2 ]
n = len(arr)
pos = 4
 
# Function Call
print(minIndex(arr, n, pos))
 
# This code is contributed by
# Mohit Kumar 29

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach
using System;
class GFG {
 
    // Function to return the minimum required index
    static int minIndex(int[] arr, int n, int pos)
    {
        int num = arr[pos];
 
        // Start from arr[pos - 1]
        int i = pos - 1;
        while (i >= 0) {
            if (arr[i] != num)
                break;
            i--;
        }
 
        // All elements are equal
        // from arr[i + 1] to arr[pos]
        return i + 1;
    }
 
    // Driver code
    public static void Main()
    {
        int[] arr = { 2, 1, 1, 1, 5, 2 };
        int n = arr.Length;
        int pos = 4;
         
          // Function Call
        Console.WriteLine(minIndex(arr, n, pos));
    }
}
 
// This code is contributed
// by Akanksha Rai

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP implementation of the approach
 
// Function to return the minimum
// required index
function minIndex($arr, $n, $pos)
{
    $num = $arr[$pos];
 
    // Start from arr[pos - 1]
    $i = $pos - 1;
    while ($i >= 0)
    {
        if ($arr[$i] != $num)
            break;
        $i--;
    }
 
    // All elements are equal
    // from arr[i + 1] to arr[pos]
    return $i + 1;
}
 
// Driver code
$arr = array(2, 1, 1, 1, 5, 2 );
$n = sizeof($arr);
$pos = 4;
 
echo minIndex($arr, $n, $pos);
 
// This code is contributed by Ryuga
?>

chevron_right


Output

4

Time Complexity: O(N)
Space Complexity: O(1)

Efficient Approach :

Do a binary search in the sub-array [0, pos-1]. Stop condition will be if arr[mid] == arr[pos] && arr[mid-1] != arr[pos]. Go-left or Go-right will depend on if arr[mid] == arr[pos] or not respectively.

Implementation:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the minimum required index
int minIndex(int arr[], int pos)
{
    int low = 0;
    int high = pos;
    int i = pos;
 
    while (low < high) {
        int mid = (low + high) / 2;
        if (arr[mid] != arr[pos]) {
            low = mid + 1;
        }
        else {
            high = mid - 1;
            i = mid;
            if (mid > 0 && arr[mid - 1] != arr[pos]) {
 
                // Short-cicuit more comparisions as found
                // the border point
                break;
            }
        }
    }
 
    // For cases were high = low + 1 and arr[high] will
    // match with
    // arr[pos] but not arr[low] or arr[mid]. In such
    // iteration the if condition will satisfy and loop will
    // break post that low will be updated. Hence i will not
    // point to the correct index.
    return arr[low] == arr[pos] ? low : i;
}
 
// Driver code
int main()
{
    int arr[] = { 2, 1, 1, 1, 5, 2 };
 
    cout << minIndex(arr, 2) << endl; // Should be 1
    cout << minIndex(arr, 3) << endl; // Should be 1
    cout << minIndex(arr, 4) << endl; // Should be 4
    return 0;
}
 
// This code is contributed by
// anshbikram

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
 
class GFG {
     
      // Function to return the minimum required index
    static int minIndex(int arr[], int pos)
    {
        int low = 0;
        int high = pos;
        int i = pos;
 
        while (low < high) {
            int mid = (low + high) / 2;
            if (arr[mid] != arr[pos]) {
                low = mid + 1;
            }
            else {
                high = mid - 1;
                i = mid;
                if (mid > 0 && arr[mid - 1] != arr[pos]) {
                     
                      // Short-cicuit more comparisions as
                    // found the border point
                    break;
                }
            }
        }
 
        // For cases were high = low + 1 and arr[high] will
        // match with arr[pos] but not arr[low] or arr[mid].
        // In such iteration the if condition will satisfy
        // and loop will break post that low will be
        // updated. Hence i will not point to the correct
        // index.
        return arr[low] == arr[pos] ? low : i;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = { 2, 1, 1, 1, 5, 2 };
 
        System.out.println(minIndex(arr, 2)); // Should be 1
        System.out.println(minIndex(arr, 3)); // Should be 1
        System.out.println(minIndex(arr, 4)); // Should be 4
    }
}
 
// This code is contributed by
// anshbikram

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach
 
# Function to return the minimum
# required index
 
def minIndex(arr, pos):
    low = 0
    high = pos
    i = pos
 
    while low < high:
        mid = (low + high)//2
        if arr[mid] != arr[pos]:
            low = mid + 1
        else:
            high = mid - 1
            i = mid
            if mid > 0 and arr[mid-1] != arr[pos]:
 
                # Short-cicuit more comparisions as found the border point
                break
 
    # For cases were high = low + 1 and arr[high] will match with
    # arr[pos] but not arr[low] or arr[mid]. In such iteration
    # the if condition will satisfy and loop will break post that
    # low will be updated. Hence i will not point to the correct index.
    return low if arr[low] == arr[pos] else i
 
 
# Driver code
arr = [2, 1, 1, 1, 5, 2]
 
print(minIndex(arr, 2))  # Should be 1
print(minIndex(arr, 3))  # Should be 1
print(minIndex(arr, 4))  # Should be 4
 
# This code is contributed by
# anshbikram

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach
using System;
 
class GFG{
     
// Function to return the minimum
// required index
static int minIndex(int []arr, int pos)
{
    int low = 0;
    int high = pos;
    int i = pos;
 
    while (low < high)
    {
        int mid = (low + high) / 2;
        if (arr[mid] != arr[pos])
        {
            low = mid + 1;
        }
        else
        {
            high = mid - 1;
            i = mid;
            if (mid > 0 && arr[mid - 1] != arr[pos])
            {
                 
                // Short-cicuit more comparisions as
                // found the border point
                break;
            }
        }
    }
 
    // For cases were high = low + 1 and arr[high] will
    // match with arr[pos] but not arr[low] or arr[mid].
    // In such iteration the if condition will satisfy
    // and loop will break post that low will be
    // updated. Hence i will not point to the correct
    // index.
    return arr[low] == arr[pos] ? low : i;
}
 
// Driver code
public static void Main()
{
    int []arr = { 2, 1, 1, 1, 5, 2 };
 
    Console.WriteLine(minIndex(arr, 2)); // Should be 1
    Console.WriteLine(minIndex(arr, 3)); // Should be 1
    Console.WriteLine(minIndex(arr, 4)); // Should be 4
}
}
 
// This code is contributed by chitranayal

chevron_right


Output

1
1
4

Time Complexity: O(log(n))
Space Complexity: O(1)

competitive-programming-img




My Personal Notes arrow_drop_up
Recommended Articles
Page :