Имеется массив 1 и 0, размером N
.
1 1 1 1 1 0 0 0 0 0 0
Нужно за logN
определить место на котором стоит самая правая(последняя единица). Если единиц нет вовсе вывести -1
.
В голову пришел бинарный поиск:
- если попали на ноль, идем влево
- если единица пробуем расширится пройдясь правее
Но с написанием кода возникли проблемы (((
Вы можете воспользоваться либо стандартным алгоритмом std::upper_bound
с использованием 1 в качестве аргумента, или алгоритмом std::lower_bound
с использованием 0 в качестве аргумента.
Например,
#include <iostream>
#include <functional>
#include <iterator>
#include <algorithm>
int main()
{
int a[] = { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, };
auto it = std::upper_bound(std::begin(a), std::end(a),
1, std::greater<int>());
if (it != std::begin(a))
{
std::cout << "The last 1 is at the position "
<< std::distance(std::begin(a), std::prev(it))
<< std::endl;
}
else
{
std::cout << "There is no 1 in the array" << std::endl;
}
}
Вывод программы на консоль
The last 1 is at the position 4
Вместо выражения
std::distance(std::begin(a), std::prev(it))
вы можете использовать выражение
std::distance(std::begin(a), it) - 1
И тогда вы получите искомую позицию, если 1 присутствует в массиве или -1, если нет ни одной 1.
Вместо псевдокода приведу javascript
function search(arr) {
// стартовый диапазон
let start = 0, end = arr.length;
do {
// середина
let middle = Math.floor((end-start)/2)+start;
if (arr[middle] == 1) {
start = middle; // обрезаем половину со старта
} else {
end = middle; // обрезаем половину с хвоста
}
} while(end - start > 1); // остался один элемент
return arr[start] == 1 ? start : -1; // нашли?
}
console.log(search([1,1,1,0,0,0,0,0])); // 2
console.log(search([1,1,1,1,1,0,0,0])); // 4
console.log(search([1,0,0,0,0,0,0,0])); // 0
console.log(search([0,0,0,0,0,0,0,0])); // -1
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Доброго времени суток! Учусь работать в среде netbeans IDE 81 на ubuntu
Если говорить просто и коротко, то меня интересует: количество и примеры undefined behaviour для каждого из этих типов
Есть функция _tctime которая форматирует число в строку следующего формата:
Уважаемые коллеги! Производственная необходимость просит написать текущее время за минусом 10 минут и у меня не очень-то получаетсяНапомню,...