Подумайте вот о чем: ваш ввод (1,3,5,7, ......, 2,4,6,8), а его длина равна n.
Ваш результат обязательно будет не будет 0 (вы знаете, что это странно), но, вероятно, он не будет последним.
Самая важная концепция, лежащая в основе Divide et impera , заключается в том, что проще завоевать что-то меньшее . Итак, разделите ваш массив на две части и посмотрите только на одну сторону, убедившись, что другая часть не будет содержать ваш результат.
Предположим, что наш массив (с этого момента называемый «a») имеет индексы от 0 к n-1 (a [n-1] = 8). Давайте проверим середину, поэтому для начала нам нужен индекс.
int mid = (0 + n-1)/2
что такое [mid]?
это нечетно? тогда мы должны смотреть на правую сторону, от mid + 1 до n-1
это четное? у нас есть две возможности:
- является ли mid-1 допустимым индексом и является ли нечетным [mid-1]? тогда [mid] - это первый четный элемент, а mid - результат
- иначе посмотрите на левую сторону от 0 до середины 1
затем просто делайте это рекурсивно :)
Я не слишком привык к C, поэтому напишу псевдокод
int exercise(int[] a, int n) {
return exerciseRecursive(a, 0, n-1);
}
int exerciseRecursive(int[] a, int start, int end) {
if (start>end) {
return -1; //there is no even element
}
int mid = (start + end)/2;
if (a[mid]%2==1) { //odd
return exerciseRecursive(a,mid+1,end);
}
else {
if (mid-1>=0 && a[mid-1]%2==1) { //the current element is even and the previous is odd
return mid;
}
else {
return exerciseRecursive(a,start,mid-1);
}
}
}