Goal: Find the first and last index where 3 appears in the list
Step 1: Check element at index 0 (5), not 3
[5, 3, 7, 3, 9, 3, 2]
first = -1, last = -1
Why: We start from the beginning to find the first occurrence
Step 2: Check element at index 1 (3), matches target
[5, 3, 7, 3, 9, 3, 2]
first = 1, last = 1
Why: First time we see 3, record index 1 as first and last
Step 3: Check element at index 2 (7), not 3
[5, 3, 7, 3, 9, 3, 2]
first = 1, last = 1
Why: No change, keep looking
Step 4: Check element at index 3 (3), matches target
[5, 3, 7, 3, 9, 3, 2]
first = 1, last = 3
Why: Update last occurrence to index 3
Step 5: Check element at index 4 (9), not 3
[5, 3, 7, 3, 9, 3, 2]
first = 1, last = 3
Why: No change, continue
Step 6: Check element at index 5 (3), matches target
[5, 3, 7, 3, 9, 3, 2]
first = 1, last = 5
Why: Update last occurrence to index 5
Step 7: Check element at index 6 (2), not 3
[5, 3, 7, 3, 9, 3, 2]
first = 1, last = 5
Why: No change, finished scanning
Result:
Final: first occurrence = 1, last occurrence = 5
Annotated Code
DSA Typescript
class FirstLastOccurrence {
static findFirstAndLast(arr: number[], target: number): [number, number] {
let first = -1;
let last = -1;
for (let 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];
}
}
// Driver code
const arr = [5, 3, 7, 3, 9, 3, 2];
const target = 3;
const [first, last] = FirstLastOccurrence.findFirstAndLast(arr, target);
console.log(`First occurrence of ${target}: ${first}`);
console.log(`Last occurrence of ${target}: ${last}`);
for (let 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 index if not set yet
last = i;
update last occurrence index to current
OutputSuccess
First occurrence of 3: 1
Last occurrence of 3: 5
Complexity Analysis
Time: O(n) because we scan the entire list once to find occurrences
Space: O(1) because we only store two indexes regardless of input size
vs Alternative: Better than searching twice separately for first and last; this does both in one pass
Edge Cases
Empty array
Returns [-1, -1] indicating target not found
DSA Typescript
for (let i = 0; i < arr.length; i++) {
Target not in array
Returns [-1, -1] since no match found
DSA Typescript
if (arr[i] === target) {
Target appears once
First and last occurrence are the same index
DSA Typescript
if (first === -1) { first = i; }
When to Use This Pattern
When asked to find positions of an element's first and last appearance in a list, use a single pass scan updating first and last indexes.
Common Mistakes
Mistake: Searching for first and last occurrence in separate loops Fix: Combine into one loop to improve efficiency
Mistake: Not initializing first to -1 and assuming target is always found Fix: Initialize first and last to -1 to handle target absence properly
Summary
Finds the first and last positions of a target element in a list.
Use when you need both positions efficiently in one pass.
Remember to update last occurrence every time you find the target, and set first only once.
Practice
(1/5)
1. What does the "First and Last Occurrence of Element" problem ask you to find in an array?
easy
A. The maximum element in the array
B. The sum of all elements in the array
C. The first and last positions where a given element appears
D. The number of unique elements in the array
Solution
Step 1: Understand the problem statement
The problem asks to find the first and last index positions of a specific element in an array.
Step 2: Identify what is required
We need to locate where the element appears first and last, not sums or counts.
Final Answer:
The first and last positions where a given element appears -> Option C
Quick Check:
First and last occurrence = positions of element [OK]
Hint: Look for positions of element, not sums or counts [OK]
Common Mistakes:
Confusing occurrence with sum or max
Thinking about unique elements instead
Ignoring the order of elements
2. Which of the following TypeScript function signatures correctly represents a function to find first and last occurrence of a number in an array?
easy
A. function findOccurrences(arr: number[], target: number): number
B. function findOccurrences(arr: string[], target: string): number
C. function findOccurrences(arr: number, target: number): number[]
D. function findOccurrences(arr: number[], target: number): [number, number]
Solution
Step 1: Analyze the function parameters
The function should take an array of numbers and a target number to find.
Step 2: Analyze the return type
We want to return two numbers (first and last index), so a tuple [number, number] is appropriate.
Final Answer:
function findOccurrences(arr: number[], target: number): [number, number] -> Option D
Quick Check:
Input array and target, output tuple of two indexes [OK]
Hint: Return a tuple of two numbers for first and last indexes [OK]
Common Mistakes:
Using wrong input types like single number instead of array
Returning only one number instead of two
Returning array of wrong type
3. What will be the output of the following TypeScript code?
function findOccurrences(arr: number[], target: number): [number, number] {
let first = -1;
let last = -1;
for (let i = 0; i < arr.length; i++) {
if (arr[i] === target) {
if (first === -1) first = i;
last = i;
}
}
return [first, last];
}
console.log(findOccurrences([5, 3, 7, 3, 9], 3));
medium
A. [1, 3]
B. [3, 3]
C. [0, 4]
D. [-1, -1]
Solution
Step 1: Trace the loop to find first occurrence
At index 1, element is 3 which matches target, so first = 1.
Step 2: Update last occurrence while looping
At index 3, element is 3 again, so last = 3.
Final Answer:
[1, 3] -> Option A
Quick Check:
First = 1, Last = 3 [OK]
Hint: Track first when found, update last every time [OK]
Common Mistakes:
Returning first occurrence twice
Returning indexes of wrong elements
Not updating last occurrence properly
4. Identify the bug in this TypeScript function to find first and last occurrence:
function findOccurrences(arr: number[], target: number): [number, number] {
let first = 0;
let last = 0;
for (let i = 0; i < arr.length; i++) {
if (arr[i] === target) {
if (first === 0) first = i;
last = i;
}
}
return [first, last];
}
medium
A. last should be initialized to -1 instead of 0
B. first initialized to 0 causes wrong first occurrence when target is at index 0
C. Loop should start from 1 instead of 0
D. Missing return type annotation
Solution
Step 1: Check initialization of first
first is set to 0, so if target is at index 0, condition first === 0 is true initially, causing incorrect logic.
Step 2: Understand impact on first occurrence
If target is at index 0, first will never update correctly because first === 0 is true initially, so first stays 0 even if target not found.
Final Answer:
first initialized to 0 causes wrong first occurrence when target is at index 0 -> Option B
Quick Check:
Initialize first to -1 to fix [OK]
Hint: Initialize first to -1 to detect if target found [OK]
Common Mistakes:
Initializing first to 0 instead of -1
Not handling target at index 0 correctly
Assuming first occurrence is always > 0
5. Given a sorted array with possible duplicates, which approach is the most efficient to find the first and last occurrence of a target element?
hard
A. Use two binary searches: one for first occurrence, one for last occurrence
B. Traverse the array from start to end to find first and last occurrence
C. Sort the array again and then find the element
D. Use a hash map to store all occurrences and then find first and last
Solution
Step 1: Understand the array is sorted
Since the array is sorted, binary search can be used to find elements efficiently.
Step 2: Use binary search twice
One binary search finds the first occurrence, another finds the last occurrence, both in O(log n) time.
Step 3: Compare with other options
Traversing is O(n), sorting again is unnecessary, hash map uses extra space and is less efficient.
Final Answer:
Use two binary searches: one for first occurrence, one for last occurrence -> Option A
Quick Check:
Binary search twice = efficient for sorted arrays [OK]
Hint: Use binary search twice for first and last positions [OK]
Common Mistakes:
Using linear search on sorted array
Sorting array again unnecessarily
Using extra space with hash map
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.