Bird
Raised Fist0
DSA C#programming

First and Last Occurrence of Element in DSA C#

Choose your learning style10 modes available
Mental Model
Find where a number first appears and last appears in a list by checking each item from start to end.
Analogy: Imagine looking through a photo album to find the first and last pictures of your friend. You start from the first photo and move forward until you find the first and last times your friend appears.
Array: [5] -> [3] -> [7] -> [3] -> [9] -> [3] -> null
Indexes:  0      1      2      3      4      5
Dry Run Walkthrough
Input: list: [5, 3, 7, 3, 9, 3], find first and last occurrence of 3
Goal: Find the first and last positions where 3 appears in the list
Step 1: Check element at index 0 (5), not 3
[5] -> [3] -> [7] -> [3] -> [9] -> [3] -> null
Indexes:  0      1      2      3      4      5
First: -1, Last: -1
Why: We start from the beginning to find the first occurrence
Step 2: Check element at index 1 (3), found first occurrence
[5] -> [3] -> [7] -> [3] -> [9] -> [3] -> null
Indexes:  0      1      2      3      4      5
First: 1, Last: 1
Why: First time we see 3, record index 1
Step 3: Check element at index 2 (7), not 3
[5] -> [3] -> [7] -> [3] -> [9] -> [3] -> null
Indexes:  0      1      2      3      4      5
First: 1, Last: 1
Why: Keep looking for last occurrence
Step 4: Check element at index 3 (3), update last occurrence
[5] -> [3] -> [7] -> [3] -> [9] -> [3] -> null
Indexes:  0      1      2      3      4      5
First: 1, Last: 3
Why: Found 3 again, update last occurrence to index 3
Step 5: Check element at index 4 (9), not 3
[5] -> [3] -> [7] -> [3] -> [9] -> [3] -> null
Indexes:  0      1      2      3      4      5
First: 1, Last: 3
Why: Keep looking for last occurrence
Step 6: Check element at index 5 (3), update last occurrence
[5] -> [3] -> [7] -> [3] -> [9] -> [3] -> null
Indexes:  0      1      2      3      4      5
First: 1, Last: 5
Why: Found 3 again, update last occurrence to index 5
Result:
First occurrence at index 1, last occurrence at index 5
Array: [5] -> [3] -> [7] -> [3] -> [9] -> [3] -> null
Annotated Code
DSA C#
using System;

class FirstLastOccurrence
{
    public static (int, int) FindFirstAndLast(int[] arr, int target)
    {
        int first = -1;
        int last = -1;
        for (int i = 0; i < arr.Length; i++)
        {
            if (arr[i] == target)
            {
                if (first == -1)
                {
                    first = i; // record first occurrence
                }
                last = i; // update last occurrence
            }
        }
        return (first, last);
    }

    static void Main()
    {
        int[] arr = {5, 3, 7, 3, 9, 3};
        int target = 3;
        var (first, last) = FindFirstAndLast(arr, target);
        Console.WriteLine($"First occurrence of {target}: {first}");
        Console.WriteLine($"Last occurrence of {target}: {last}");
    }
}
for (int i = 0; i < arr.Length; i++)
iterate through each element to check for target
if (arr[i] == target)
check if current element matches target
if (first == -1) { first = i; }
record first occurrence only once
last = i;
update last occurrence whenever target found
OutputSuccess
First occurrence of 3: 1 Last occurrence of 3: 5
Complexity Analysis
Time: O(n) because we scan the entire array once to find first and last occurrences
Space: O(1) because we use only a few variables regardless of input size
vs Alternative: Compared to searching twice (once for first, once for last), this single pass is more efficient
Edge Cases
empty array
returns -1 for both first and last because target not found
DSA C#
for (int i = 0; i < arr.Length; i++)
target not in array
returns -1 for both first and last indicating no occurrence
DSA C#
if (arr[i] == target)
target appears only once
first and last both equal the single index where target appears
DSA C#
if (first == -1) { first = i; }
When to Use This Pattern
When asked to find the first and last positions of a value in a list, use a single pass scan updating first and last indices to solve efficiently.
Common Mistakes
Mistake: Stopping after finding the first occurrence and not checking for last occurrence
Fix: Continue scanning the entire array to update last occurrence
Mistake: Updating first occurrence multiple times
Fix: Only set first occurrence when it is still -1
Summary
Finds the first and last positions of a target element in an array.
Use when you need to know where a value starts and ends in a list.
Remember to scan the whole list once, recording first time and updating last time you see the target.

Practice

(1/5)
1. What does the "First and Last Occurrence of Element" problem ask you to find in an array?
easy
A. The number of unique elements in the array
B. The sum of all elements in the array
C. The maximum and minimum elements in the array
D. The first and last positions where a given element appears

Solution

  1. Step 1: Understand the problem statement

    The problem asks to find the first and last positions of a specific element in an array.
  2. Step 2: Differentiate from other array queries

    It is not about sums, max/min, or counting unique elements, but about positions of a target element.
  3. Final Answer:

    The first and last positions where a given element appears -> Option D
  4. Quick Check:

    Positions of element = first and last occurrence [OK]
Hint: Look for positions of target element, not values or counts [OK]
Common Mistakes:
  • Confusing with finding max or min element
  • Trying to sum elements instead of finding positions
  • Counting unique elements instead of occurrences
2. Which of the following C# code snippets correctly initializes an array to find the first and last occurrence of an element?
easy
A. int arr = {1, 2, 3, 4, 5};
B. int arr = new int[5] {1, 2, 3, 4, 5};
C. int[] arr = new int[] {1, 2, 3, 4, 5};
D. int arr[] = new int[] {1, 2, 3, 4, 5};

Solution

  1. Step 1: Check array initialization syntax in C#

    Correct syntax is: int[] arr = new int[] {1, 2, 3, 4, 5};
  2. Step 2: Identify incorrect options

    int arr = new int[5] {1, 2, 3, 4, 5}; has wrong syntax (cannot assign array with size and initializer like that), A is missing 'new int[]', D uses C-style syntax invalid in C#.
  3. Final Answer:

    int[] arr = new int[] {1, 2, 3, 4, 5}; -> Option C
  4. Quick Check:

    Correct C# array syntax = int[] arr = new int[] {1, 2, 3, 4, 5}; [OK]
Hint: Use 'int[] arr = new int[] { ... }' for array initialization [OK]
Common Mistakes:
  • Using C/C++ style array declarations
  • Omitting 'new int[]' keyword
  • Assigning array size with initializer incorrectly
3. What will be the output of the following C# code?
int[] arr = {5, 3, 7, 3, 9};
int target = 3;
int first = -1, last = -1;
for (int i = 0; i < arr.Length; i++) {
  if (arr[i] == target) {
    if (first == -1) first = i;
    last = i;
  }
}
Console.WriteLine($"{first} {last}");
medium
A. 3 1
B. 1 3
C. 0 4
D. -1 -1

Solution

  1. Step 1: Trace the loop to find first and last occurrence of 3

    Array: [5, 3, 7, 3, 9]. Target = 3. Indices: 0 to 4.
    i=0: arr[0]=5 !=3 skip
    i=1: arr[1]=3 == target, first=-1 so first=1, last=1
    i=2: arr[2]=7 !=3 skip
    i=3: arr[3]=3 == target, first=1 (unchanged), last=3
    i=4: arr[4]=9 !=3 skip
  2. Step 2: Print first and last

    first=1, last=3
  3. Final Answer:

    1 3 -> Option B
  4. Quick Check:

    First and last index of 3 = 1 and 3 [OK]
Hint: Track first when found, update last every time [OK]
Common Mistakes:
  • Swapping first and last indices
  • Not updating last occurrence correctly
  • Initializing first and last with wrong values
4. Identify the error in the following code that tries to find the first and last occurrence of an element:
int[] arr = {2, 4, 2, 5, 2};
int target = 2;
int first = 0, last = 0;
for (int i = 0; i < arr.Length; i++) {
  if (arr[i] == target) {
    first = i;
    last = i;
  }
}
Console.WriteLine($"{first} {last}");
medium
A. first and last are initialized incorrectly, causing wrong output
B. Loop condition should be i <= arr.Length
C. Target value is not assigned properly
D. Console.WriteLine syntax is incorrect

Solution

  1. Step 1: Analyze initialization of first and last

    Both first and last start at 0. Inside loop, first and last are set to i every time target is found, so first will be overwritten and end up as last occurrence index.
  2. Step 2: Identify correct approach

    First should be set only once when first occurrence is found (e.g., if first == -1). Last should update every time target is found.
  3. Final Answer:

    first and last are initialized incorrectly, causing wrong output -> Option A
  4. Quick Check:

    Initialize first to -1 and update only once [OK]
Hint: Initialize first to -1 and update only once [OK]
Common Mistakes:
  • Overwriting first occurrence index
  • Using wrong loop boundary
  • Incorrect Console.WriteLine format
5. Given a sorted array with possible duplicates, how can you efficiently find the first and last occurrence of a target element using C#?
hard
A. Use two binary searches: one for first occurrence, one for last occurrence
B. Traverse the array twice: once from start, once from end
C. Use a dictionary to store element counts
D. Sort the array again and find the target

Solution

  1. Step 1: Understand the array is sorted with duplicates

    Sorted array allows binary search to find positions efficiently.
  2. Step 2: Use binary search twice

    One binary search finds the first occurrence by moving left when target found, another finds last occurrence by moving right.
  3. Step 3: Avoid full traversal or extra sorting

    Traversing twice or sorting again is inefficient. Dictionary counts do not give positions.
  4. Final Answer:

    Use two binary searches: one for first occurrence, one for last occurrence -> Option A
  5. Quick Check:

    Binary search twice = efficient first and last occurrence [OK]
Hint: Binary search twice for first and last occurrence in sorted array [OK]
Common Mistakes:
  • Using linear search on large sorted arrays
  • Sorting array again unnecessarily
  • Using dictionary counts instead of positions
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard