Угадай число

Легкая

Описание задачи #

Мы играем в игру, где вы должны угадать загаданное число.

Игра заключается в следующем.

Вы можете использовать предоставленный метод guess для проверки догадки со следующей сигнатурой int guess(int num).

Метод возвращает следующие результаты:

Угадайте число, которое я загадал.


Ограничения #

Загадываемое число всегда находится в диапазоне от 1 до 231 - 1


Примеры #

  • Исходные данные: n = 10, загадано число 6

    Ответ: 6

  • Исходные данные: n = 1, загадано число 1

    Ответ: 1

  • Исходные данные: n = 2, загадано число 1

    Ответ: 1


Решение #

Это классическая задача, которая решается при помощи бинарного поиска.

Нам нужно итеративно выполнять несколько шагов.

  1. Найти крайнюю левую и правую границы интервала, то есть 1 и n соответственно.
  2. Найти середину этого интервала и проверить полученное число:

Этот алгоритм нужно повторять до тех пор, пока мы не найдем ответ или пока левая и правая границы не пересекутся.

Реализация #

  • package guess_number_higher_or_lower
    
    var guess func(num int) int
    
    func guessNumber(n int) int {
    	left := 1
    	right := n
    
    	for left <= right {
    		mid := (left + right) / 2
    		res := guess(mid)
    
    		if res == 0 {
    			return mid
    		} else if res == 1 {
    			left = mid + 1
    		} else {
    			right = mid - 1
    		}
    	}
    
    	return 0
    }

  • // Для реализации примера функция принимает в качестве параметра функцию guess.
    // В задаче на leetcode это функция предоставляется как API.
    export const guessNumber = (n: number, guess: (num: number) => number): number => {
        let left = 1
        let right = n
    
        while (left <= right) {
            const mid = Math.floor((left + right) / 2)
            const res = guess(mid)
    
            if (res === 0) {
                return mid
            } else if (res === 1) {
                left = mid + 1
            } else {
                right = mid - 1
            }
        }
    
        return 0
    }

Оценка сложности #

По времени

O(log2 n) так как мы перебираем диапазон чисел бинарным поиском.

По памяти

0(1) так как мы не выделяем дополнительной памяти.

Оригинал задачи на Leetcode
< Предыдущая задача
Следующая задача >