ในปัญหานี้ เราได้รับ Infinite sorted array ของ 0 และ 1 (มี 1 อย่างน้อย 1 ตัว) งานคือหา index ของ 1 ตัวแรก
ตัวอย่าง
Input: bin[] = {0, 0, 0, 1, 1, ...} Output: 3
วิธีที่ 1: Linear Search O(Index) - ไม่เหมาะกับ Infinite Array
int findFirstOneLinear(int bin[]) {
for (int i = 0; ; i++) if (bin[i] == 1) return i;
return -1;
}
วิธีที่ 2: Exponential Search + Binary Search O(log Index) (แนะนำ)
- หา upper bound โดย double high: 1, 2, 4, 8, ... จน bin[high] == 1
- Binary search ในช่วง [low, high] หา 1 แรก
ตัวอย่างโค้ด (วิธีที่ 2)
#include <iostream>
using namespace std;
int binarySearchFirstOne(int bin[], int low, int high) {
while (low <= high) {
int mid = (low + high) / 2;
if (bin[mid] == 1 && (mid == 0 || bin[mid - 1] == 0)) return mid;
else if (bin[mid] == 1) high = mid - 1;
else low = mid + 1;
}
return -1;
}
int findFirstOneInfinite(int bin[]) {
int low = 0, high = 1;
while (bin[high] != 1) { low = high; high *= 2; }
return binarySearchFirstOne(bin, low, high);
}
int main() {
int bin[] = {0, 0, 0, 1, 1, 1, 1};
cout << findFirstOneInfinite(bin); // 3
return 0;
}
ผลลัพธ์
3