Two Pointers - Valid Subsequence Checker
Problem Statement
Given two arrays of integers, determine if the second array is a valid subsequence of the first. A subsequence is a sequence that can be derived from the original array by deleting some or no elements without changing the order of the remaining elements. This is an easy-level problem that tests your ability to traverse arrays while maintaining order.
Example
Input: array = [5, 1, 22, 25, 6, -1, 8, 10], sequence = [1, 6, -1, 10]
Output: true (the sequence [1, 6, -1, 10] appears in order within the array)
Input: array = [5, 1, 22, 25, 6, -1, 8, 10], sequence = [25, 1, 6]
Output: false (the order does not match)
Code
Java
                Python
                JavaScript
            
public class Solution {
    public boolean isValidSubsequence(int[] array, int[] sequence) {
        int seqIndex = 0;
        
        for (int value : array) {
            if (seqIndex == sequence.length) {
                break;
            }
            if (sequence[seqIndex] == value) {
                seqIndex++;
            }
        }
        return seqIndex == sequence.length;
    }
}
            
            
def is_valid_subsequence(array, sequence):
    seq_idx = 0
    
    for value in array:
        if seq_idx == len(sequence):
            break
        if sequence[seq_idx] == value:
            seq_idx += 1
    return seq_idx == len(sequence)
# Example usage
print(is_valid_subsequence([5, 1, 22, 25, 6, -1, 8, 10], [1, 6, -1, 10]))  # True
print(is_valid_subsequence([5, 1, 22, 25, 6, -1, 8, 10], [25, 1, 6]))      # False
            
            
function isValidSubsequence(array, sequence) {
    let seqIndex = 0;
    
    for (let value of array) {
        if (seqIndex === sequence.length) {
            break;
        }
        if (sequence[seqIndex] === value) {
            seqIndex++;
        }
    }
    return seqIndex === sequence.length;
}
// Example usage
console.log(isValidSubsequence([5, 1, 22, 25, 6, -1, 8, 10], [1, 6, -1, 10])); // true
console.log(isValidSubsequence([5, 1, 22, 25, 6, -1, 8, 10], [25, 1, 6]));    // false
            
        Explanation
- Initialize a pointer (seqIndex) to track progress in the sequence array.
- Iterate through the main array, checking each element against the current sequence element.
- If there’s a match, increment the sequence pointer to move to the next element.
- Stop if the sequence pointer reaches the end (all elements found) or continue until the array is exhausted.
- Return true if the entire sequence was matched, false otherwise.
Note
                Time complexity is O(n) where n is the length of the main array. Space complexity is O(1) as only a single variable is used.
            
        