중복이 없고, 정렬된 숫자 배열에서 인덱스와 해당 값이 일치할 때 가장 작은 인덱스를 반환하는 문제다.
선형탐색
- 이미 정렬되어 있으니, 맨 처음부터 해당 값과 인덱스가 같은지 비교하고, 같다면 바로 해당 인덱스를 반환한다.
이분탐색
package com.company.w6;
/*
date: 21.07.19
I: int array -> sorted, distinct int
O: int -> min idx
C: int의 범위는 없는듯 하다.
E: 해당되는 인덱스가 없을 경우 -1 반환, 입력 배열의 길이가 0일 때도 -1 반환
linear: time - O(N), space - O(1)
binary search: time - O(logN), space - O(1)
*/
public class No12 {
public static void main(String[] args) {
int[] array = {-5, -3, 2, 3, 4, 5, 9};
System.out.println("linear = " + linearFindSameIdx(array));
System.out.println("binary = " + binarySearchFindSameIdx(array));
}
public static int linearFindSameIdx(int[] array) {
// base case
if (array.length == 0) return -1;
int minIdx = -1;
for (int i = 0; i < array.length; i++) {
if (array[i] == i) {
minIdx = i;
break;
}
}
return minIdx;
}
public static int binarySearchFindSameIdx(int[] array) {
// base case
if (array.length == 0) return -1;
int minIdx = -1;
int left = 0, right = array.length - 1, mid;
while (left <= right) {
mid = left + (right - left) / 2;
// 바로 답인 경우
if (array[mid] == mid && array[mid - 1] != mid - 1) {
minIdx = mid;
break;
}
if (array[mid] < mid) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return minIdx;
}
}