0374. Đoán số

  • Thẻ: Tìm kiếm nhị phân, Tương tác
  • Độ khó: Dễ

Ý tưởng

Mô tả: Trò chơi đoán số. Cho một số nguyên và một giao diện def guess(num: int) -> int:. Đề bài sẽ chọn một số ngẫu nhiên từ . Chúng ta chỉ có thể sử dụng giao diện để kiểm tra xem số đoán của chúng ta có đúng không.

Yêu cầu: Trả về số mà đề bài đã chọn.

Giải thích:

  • def guess(num: int) -> int: giá trị trả về:
    • : Số tôi chọn nhỏ hơn số bạn đoán, tức là ;
    • : Số tôi chọn lớn hơn số bạn đoán, tức là ;
    • : Số tôi chọn giống số bạn đoán. Chúc mừng! Bạn đã đoán đúng! .

Ví dụ:

  • Ví dụ 1:
Input: n = 10, pick = 6
Output: 6
  • Ví dụ 2:
Input: n = 1, pick = 1
Output: 1

Ý tưởng

Ý tưởng 1: Tìm kiếm nhị phân

Sử dụng hai con trỏ . trỏ đến số , trỏ đến số . Mỗi lần kiểm tra từ giữa và gọi giao diện để đoán xem đúng không.

  • Nếu số đoán lớn hơn số đã chọn, thì dịch con trỏ sang trái, tức là right = mid - 1, tiếp tục kiểm tra từ giữa;
  • Nếu số đoán nhỏ hơn số đã chọn, thì dịch con trỏ sang phải, tức là left = mid + 1, tiếp tục kiểm tra từ giữa;
  • Nếu đoán đúng, thì trả về số đó.

Ý tưởng 1: Code Tìm kiếm nhị phân

class Solution:
    def guessNumber(self, n: int) -> int:
        left = 1
        right = n
        while left <= right:
            mid = left + (right - left) // 2
            ans = guess(mid)
            if ans == 1:
                left = mid + 1
            elif ans == -1:
                right = mid - 1
            else:
                return mid
        return 0

Ý tưởng 1: Độ phức tạp

  • Độ phức tạp thời gian: . Độ phức tạp thời gian của thuật toán tìm kiếm nhị phân là .
  • Độ phức tạp không gian: . Chỉ sử dụng một số biến hằng số để lưu trữ.