1. Linear Scan
Intuition
Scan the array sequentially. The first index i satisfying arr[i] > x is returned. If no element exceeds x, return n.
When to apply: Unsorted collections or very small array sizes.
Algorithm
- Step 1: Iterate index i from 0 to arr.length - 1.
- Step 2: Check if arr[i] > x.
- Step 3: If true, return index i immediately.
- Step 4: If loop finishes, return arr.length.
#include <iostream>#include <vector> using namespace std; int upperBound(const vector<int>& arr, int x) { for (int i = 0; i < (int)arr.size(); i++) { if (arr[i] > x) return i; } return arr.size();} int main() { vector<int> arr = {2, 3, 6, 7, 8, 8, 11, 11, 11, 12}; cout << "Linear Upper Bound for 11: " << upperBound(arr, 11) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(N)— Worst case checks all N elements. - Space complexity:
O(1)— Uses constant auxiliary memory.