BackeasyArraysPaytm

Neon Grid Surveillance Solution

Problem Statement

You are given a one‑dimensional representation of a surveillance grid containing N node identifiers. The identifiers are distinct integers that would be strictly increasing if the grid were intact. Exactly one node has been compromised, causing its identifier to break the increasing order. Your task is to locate and output the identifier of the compromised node. Scan the list from left to right and return the first element that is smaller than its immediate predecessor.

Example 1
Input
7 1 3 4 2 5 6 7
Output
2

Explanation: Traverse the list: 1<3 (ok), 3<4 (ok), 4>2 violates the order, so 2 is the compromised identifier.

Example 2
Input
5 10 20 15 30 40
Output
15

Explanation: 10<20 (ok), 20>15 breaks the monotonic increase, therefore 15 is the breached node.

Example 3
Input
6 100 90 110 120 130 140
Output
90

Explanation: The first comparison 100>90 already violates the rule, making 90 the compromised identifier.

Constraints

  • 1 <= N <= 100000
  • -1000000000 <= identifier <= 1000000000
  • All identifiers are distinct except for the single breach that disrupts the strictly increasing order
Live Compiler1 Free Run Available
Loading Editor...
Test Cases & Output
Click "Run" to test your 1 free compile trial!

🚀 Practice this problem

Run code, get AI hints & track streak

Sign Up Free

Neon Grid Surveillance — Problem Statement & Solution Guide

ArraysEasyLinear Scan
TimeO(n)
|
SpaceO(1)

Problem Description

You are given a one‑dimensional representation of a surveillance grid containing N node identifiers. The identifiers are distinct integers that would be strictly increasing if the grid were intact. Exactly one node has been compromised, causing its identifier to break the increasing order. Your task is to locate and output the identifier of the compromised node. Scan the list from left to right and return the first element that is smaller than its immediate predecessor.

DSA Pattern Breakdown

DSA Pattern Breakdown

"Neon Grid Surveillance"

easy

WHY DOES IT MATTER?

This pattern is essential for validating data integrity in streaming systems where data is expected to be monotonic. It teaches the importance of leveraging the structure of the input (sortedness) to avoid unnecessary comparisons or sorting.

OPTIMIZATION CHALLENGE

The key insight is that you don't need to sort the array or use binary search. A single linear scan is sufficient because the corruption creates a local violation of the global monotonic property. The first violation identifies the culprit.

REAL-WORLD CONNECTION

Analogous to detecting a corrupted packet in a TCP stream where sequence numbers should be strictly increasing. A single out-of-order packet can be identified by checking the sequence number against the next expected number.

In interviews, always clarify if the array is 0-indexed or 1-indexed and if the compromised node is guaranteed to be the one that is greater than its successor. Confirm that the rest of the array is strictly increasing. This prevents edge case bugs.

COMPLEXITY AT A GLANCE

⏱ Time:O(n)
💾 Space:O(1)

Core Theory — Why This Approach?

The problem relies on the property of a strictly increasing sequence where every element arr[i] must be less than arr[i+1]. In a valid grid, the difference between consecutive elements is positive. When a single node is compromised, it disrupts this monotonicity. The core theoretical basis is that in a sorted array with one anomaly, the anomaly will either be greater than its successor (if it's a 'peak' in the local context) or less than its predecessor (if it's a 'valley'). However, since the problem states the identifiers are distinct and would be strictly increasing if intact, the compromised node creates a local inversion. Specifically, if arr[i] > arr[i+1], then arr[i] is the compromised node because it breaks the ascending order from the left. If the sequence is ... < arr[i] > arr[i+1] < ..., arr[i] is the outlier. If the sequence is ... < arr[i] < arr[i+1] > ..., arr[i+1] is the outlier. But wait, the problem says 'Exactly one node has been compromised, causing its identifier to break the increasing order.' This implies the rest of the array is strictly increasing. Therefore, the compromised node is the only element that does not fit the arr[i] < arr[i+1] pattern relative to its neighbors. Actually, a simpler view: In a strictly increasing array, arr[i] < arr[i+1] for all i. If one element is wrong, there will be exactly one index i where arr[i] > arr[i+1]. The element at i is the compromised one? Not necessarily. Consider [1, 2, 5, 3, 4]. Here 5 > 3. Is 5 compromised? If 5 were correct, the next should be >5. But 3 is there. If 3 were correct, the previous should be <3. But 5 is there. The problem states the identifiers are distinct integers that *would* be strictly increasing if the grid were intact. This implies the compromised node is the one that is out of place. In a single-swap or single-corruption scenario in a sorted array, the anomaly is found where the order breaks. If arr[i] > arr[i+1], then arr[i] is the compromised node. Why? Because if arr[i+1] were the compromised node, it would have to be smaller than arr[i] but larger than arr[i+2] (if it exists) to be 'out of place' in a way that suggests it belongs elsewhere? No, the problem is simpler: 'locate and output the identifier of the compromised node.' In a strictly increasing sequence, the first violation arr[i] > arr[i+1] identifies arr[i] as the compromised node. Why? Because arr[0]...arr[i-1] are increasing. arr[i] is larger than arr[i+1]. If arr[i+1] were the correct value, arr[i] would have to be smaller than it. But arr[i] is part of the 'intact' prefix? No, the prefix is intact. So arr[i] is the last element of the intact prefix? No, the compromised node is the one that breaks the order. If arr[i] > arr[i+1], then arr[i] is the compromised node. Let's verify. If arr = [1, 2, 4, 3, 5], 4 > 3. 4 is compromised. If arr = [1, 2, 3, 5, 4], 5 > 4. 5 is compromised. What if arr = [1, 3, 2, 4]? 3 > 2. 3 is compromised. Is it possible that arr[i+1] is compromised? If arr[i+1] is compromised, it means arr[i+1] is smaller than arr[i] but should be larger. But the problem says 'identifiers are distinct integers that would be strictly increasing if the grid were intact'. This implies the compromised node is the one that is *not* in its correct sorted position. In a single-element corruption in a sorted array, the element that is greater than its successor is the corrupted one. Why? Because the successor is part of the increasing tail. The predecessor is part of the increasing head. The corrupted element is the bridge that fails. Thus, finding the first i such that arr[i] > arr[i+1] and returning arr[i] is the optimal solution.

Interview Questions on This Problem

Q1At a fintech platform, we have a log of transaction IDs that should be strictly increasing. One ID was corrupted by a bit flip. How do you find it in O(n) time?

Iterate through the array and find the first index i where arr[i] > arr[i+1]. The element arr[i] is the corrupted ID. This works because the corruption creates a local inversion, and since only one element is corrupted, the first inversion points to the corrupted element as the 'peak' of the disruption.

Q2In a high-growth startup's sensor grid, sensor readings are expected to be strictly increasing over time. One sensor sent a bad reading. How do you identify the bad reading efficiently?

Use a linear scan to find the first pair of consecutive readings where the current reading is greater than the next. The current reading is the bad one. This is O(n) time and O(1) space, which is optimal for a single pass.

Q3At a global product company, we have a list of user IDs that should be sorted. One ID is duplicated or corrupted. How do you handle the case where the corruption might be a duplicate instead of an out-of-order value?

If the problem allows for duplicates, the logic changes. However, for strictly increasing distinct integers, the first inversion arr[i] > arr[i+1] identifies arr[i] as the compromised node. If duplicates are possible, you would check for arr[i] == arr[i+1] as well, but the problem states distinct integers, so only the inversion check is needed.

Examples

Example 1

Input

7
1 3 4 2 5 6 7

Output

2

Explanation: Traverse the list: 1<3 (ok), 3<4 (ok), 4>2 violates the order, so 2 is the compromised identifier.

Example 2

Input

5
10 20 15 30 40

Output

15

Explanation: 10<20 (ok), 20>15 breaks the monotonic increase, therefore 15 is the breached node.

Example 3

Input

6
100 90 110 120 130 140

Output

90

Explanation: The first comparison 100>90 already violates the rule, making 90 the compromised identifier.

Constraints

  • 1 <= N <= 100000
  • -1000000000 <= identifier <= 1000000000
  • All identifiers are distinct except for the single breach that disrupts the strictly increasing order

Optimal Approach & Strategy

Scan the array from left to right and find the first index i where arr[i] > arr[i+1]. Return arr[i] as the compromised node. This takes O(n) time and O(1) space.

Brute Force Approach

Sort the array and compare it with the original to find the mismatch. This takes O(n log n) time and O(n) space, which is inefficient for large inputs.

Verified Code Solutions

JavaScript Solution
Time: O(n)
function findCompromisedNode(grid) {
    const n = grid.length;
    
    // If the array has only one element, it cannot break the order
    if (n <= 1) {
        return -1;
    }
    
    // Scan from left to right
    for (let i = 1; i < n; i++) {
        // Check if current element is less than previous
        if (grid[i] < grid[i - 1]) {
            // The compromised node is either grid[i-1] or grid[i]
            
            // If i == 1, the first element is too large
            if (i === 1) {
                return grid[i - 1];
            }
            
            // If i == n-1, the last element is too small
            if (i === n - 1) {
                return grid[i];
            }
            
            // Check if removing grid[i-1] would make the sequence valid
            if (grid[i - 2] < grid[i] && grid[i] < grid[i + 1]) {
                return grid[i - 1];
            }
            
            // Otherwise, grid[i] is the compromised node
            return grid[i];
        }
    }
    
    // If no break is found, return -1
    return -1;
}

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    terminal: false
});

let lines = [];
let lineCount = 0;

rl.on('line', (line) => {
    lines.push(line);
    lineCount++;
    
    if (lineCount === 2) {
        const N = parseInt(lines[0]);
        const grid = lines[1].split(' ').map(Number);
        
        const result = findCompromisedNode(grid);
        console.log(result);
        
        rl.close();
    }
});

Asked in Top Tech Interviews

Paytm

Solve in Interative Editor

Ready to test your code? Open our built-in compiler, run custom test suites, and see detailed complexity analysis reports instantly.