Open In App

Find start and ending index of an element in an unsorted array

Last Updated : 23 Apr, 2024
Improve
Improve
Like Article
Like
Save
Share
Report

Given an array of integers, task is to find the starting and ending position of a given key. 

Examples:  

Input : arr[] = {1, 2, 3, 4, 5, 5}
Key = 5
Output : Start index: 4
Last index: 5
Explanation: Starting index where 5
is present is 4 and ending index is 5.

Input :arr[] = {1, 3, 7, 8, 6},
Key = 2
Output : Key not present in array

Input :arr[] = {1, 8, 7, 8, 6},
Key = 7
Output : Only one occurrence of
key is present at index 2
Recommended Practice

We traverse array from beginning to find first occurrence. If element is present, then we traverse from end also to find last occurrence. 

Implementation:

C++
// CPP program to find starting and ending
// indexes of repeated numbers in an array
#include <iostream>
using namespace std;

// Function to find starting and end index
void findIndex(int a[], int n, int key)
{
    int start = -1;

    // Traverse from beginning to find
    // first occurrence
    for (int i = 0; i < n; i++) {
        if (a[i] == key) {
            start = i;
            break;
        }
    }

    if (start == -1) {
        cout << "Key not present in array";
        return;
    }

    // Traverse from end to find last
    // occurrence.
    int end = start;
    for (int i = n - 1; i >= start; i--) {
        if (a[i] == key) {
            end = i;
            break;
        }
    }
    if (start == end)
        cout << "Only one key is present at index : "
             << start;
    else {
        cout << "Start index: " << start;
        cout << "\n";
        cout << "Last index: " << end;
    }
}

// Driver Code
int main()
{
    int a[] = { 1, 2, 7, 8, 8, 9, 8, 0, 0, 0, 8 };
    int n = sizeof(a) / sizeof(a[0]);

    // Key to find
    int key = 8;

    // Calling function
    findIndex(a, n, key);

    return 0;
}
Java
// Java program to find starting and ending
// indexes of repeated numbers in an array

class Test {
    // Function to find starting and end index
    static void findIndex(int a[], int n, int key)
    {
        int start = -1;

        // Traverse from beginning to find
        // first occurrence
        for (int i = 0; i < n; i++) {
            if (a[i] == key) {
                start = i;
                break;
            }
        }

        if (start == -1) {
            System.out.println("Key not present in array");
            return;
        }

        // Traverse from end to find last
        // occurrence.
        int end = start;
        for (int i = n - 1; i >= start; i--) {
            if (a[i] == key) {
                end = i;
                break;
            }
        }
        if (start == end)
            System.out.println("Only one key is present at index : " + start);
        else {
            System.out.println("Start index: " + start);
            System.out.println("Last index: " + end);
        }
    }

    // Driver method
    public static void main(String args[])
    {
        int a[] = { 1, 2, 7, 8, 8, 9, 8, 0, 0, 0, 8 };

        // Key to find
        int key = 8;

        // Calling method
        findIndex(a, a.length, key);
    }
}
Python3
# Python3 code to find starting and ending
# indexes of repeated numbers in an array

# Function to find starting and end index
def findIndex (a, n, key ):
    start = -1
    
    # Traverse from beginning to find
    # first occurrence
    for i in range(n):
        if a[i] == key:
            start = i
            break

    if start == -1:
        print("Key not present in array")
        return 0
    
    # Traverse from end to find last
    # occurrence.
    end = start
    for i in range(n-1, start - 1, -1):
        if a[i] == key:
            end = i
            break
    if start == end:
        print("Only one key is present at index : ", start)
    else:
        print("Start index: ", start)
        print("Last index: ", end)

# Driver Code
a = [1, 2, 7, 8, 8, 9, 8, 0, 0, 0, 8]
n = len(a)

# Key to find
key = 8

# Calling function
findIndex(a, n, key)

# This code is contributed by "Sharad_Bhardwaj".
C#
// C# program to find starting and ending
// indexes of repeated numbers in an array
using System;

class GFG {

    // Function to find starting and
    // end index
    static void findIndex(int[] a, int n,
                          int key)
    {
        int start = -1;

        // Traverse from beginning to
        // find first occurrence
        for (int i = 0; i < n; i++) {
            if (a[i] == key) {
                start = i;
                break;
            }
        }

        if (start == -1) {
            Console.WriteLine("Key not "
                              + "present in array");
            return;
        }

        // Traverse from end to find last
        // occurrence.
        int end = start;
        for (int i = n - 1; i >= start; i--) {
            if (a[i] == key) {
                end = i;
                break;
            }
        }
        if (start == end)
            Console.WriteLine("Only one key is"
                              + " present at index : "
                              + start);
        else {
            Console.WriteLine("Start index: "
                              + start);

            Console.WriteLine("Last index: "
                              + end);
        }
    }

    // Driver method
    public static void Main()
    {
        int[] a = { 1, 2, 7, 8, 8, 9,
                    8, 0, 0, 0, 8 };

        // Key to find
        int key = 8;

        // Calling method
        findIndex(a, a.Length, key);
    }
}

// This code is contributed by parashar.
Javascript
<script>

// Javascript program to find starting and ending
// indexes of repeated numbers in an array

// Function to find starting and end index
function findIndex(a, n, key)
{
    let start = -1;

    // Traverse from beginning to find
    // first occurrence
    for (let i = 0; i < n; i++) {
        if (a[i] == key) {
            start = i;
            break;
        }
    }

    if (start == -1) {
        document.write("Key not present in array");
        return;
    }

    // Traverse from end to find last
    // occurrence.
    let end = start;
    for (let i = n - 1; i >= start; i--) {
        if (a[i] == key) {
            end = i;
            break;
        }
    }
    if (start == end)
        document.write("Only one key is present at index : "
            + start);
    else {
        document.write("Start index: " + start);
        document.write("<br>" + "Last index: " + end);
    }
}

// Driver Code

    let a = [ 1, 2, 7, 8, 8, 9, 8, 0, 0, 0, 8 ];
    let n = a.length;

    // Key to find
    let key = 8;

    // Calling function
    findIndex(a, n, key);

//This code is contributed by Mayank Tyagi
</script>
PHP
<?php
// PHP program to find starting and ending
// indexes of repeated numbers in an array

// Function to find starting and end index

function findIndex($arr, $find){

    // To store the atrting and 
    // the ending index of the key
    $start = -1;
    $end = -1;
    
    // For every element of the given array
    foreach ($arr as $key => $value) {
        
        // If current element is equal 
        // to the given key
        if($find === $value){
            
            // If starting index hasn't been set
            if($start==-1)
                $start = $key;
            $end = $key;
        }
    }

    // If key is not present in the array
    if($start==-1){
        return "Key not present in array";
    }
    if($end == $start){
        return "Only one key is present "." at index : ". $start;
    }
    return "Start index: ".$start. "\nLast index: ".$end;
}

// Driver code
$a = array(1, 2, 7, 8, 8, 9, 8, 0, 0, 0, 8); 

// Key to find 
$key = 8; 

// Calling function 
echo findIndex($a, $key);
?>

Output
Start index: 3
Last index: 10

Time Complexity: Worst case time complexity is O(N), ( when we traverse the whole array and don’t find the element’s start and last indices), where N represents the size of the given array. and best case time complexity will be O(1), when start index is ‘0’ and last index is ‘n – 1’.
Auxiliary Space: O(1), no extra space is required, so it is a constant.

Approach2 (Using Map)

In this approach we use a map to store the starting and ending positions of each element encountered while traversing the array. If an element is encountered for the first time, we create a new entry in the map with the starting and ending positions set to the current index. If an element is encountered again, we update the ending position in the map. Return the starting and ending positions of the key from the map.

Example : Below is the implementation of above approach

C++
#include <iostream>
#include <vector>
#include <unordered_map>

using namespace std;

pair<int, int> findPositionsHashTable(const vector<int>& arr, int key) {
    unordered_map<int, pair<int, int>> positions;
    for (int i = 0; i < arr.size(); ++i) {
        if (positions.find(arr[i]) == positions.end()) {
            positions[arr[i]] = make_pair(i, i);
        } else {
            positions[arr[i]].second = i;
        }
    }
    if (positions.find(key) != positions.end()) {
        return positions[key];
    } else {
        return make_pair(-1, -1);
    }
}

int main() {
    vector<int> arr = { 1, 2, 7, 8, 8, 9, 8, 0, 0, 0, 8};
    int key = 8;
    pair<int, int> result = findPositionsHashTable(arr, key);
    int start = result.first;
    int end = result.second;
    if (start != -1) {
        cout << "Starting index :"  << ": " << start << endl;
        cout << "Ending index : "  << ": " << end << endl;
    } else {
        cout << "Key " << key << "  is not found in the array." << endl;
    }
    return 0;
}
Python3
def find_positions_hash_table(arr, key):
    positions = {}
    for i, val in enumerate(arr):
        if val not in positions:
            positions[val] = (i, i)
        else:
            positions[val] = (positions[val][0], i)
    if key in positions:
        return positions[key]
    else:
        return (-1, -1)

def main():
    arr = [1, 2, 7, 8, 8, 9, 8, 0, 0, 0, 8]
    key = 8
    result = find_positions_hash_table(arr, key)
    start, end = result
    if start != -1:
        print("Starting index:", start)
        print("Ending index:", end)
    else:
        print("Key", key, "is not found in the array.")

if __name__ == "__main__":
    main()

Output
Starting index :: 3
Ending index : : 10

Time Complexity : O(n)

Space Complexity : O(n)


This approach is contributed by Ayush Mishra.



Related Article: 
Find first and last occurrences of an element in a sorted array

 



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads