LeetCode 0374
About 2 min
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ỏ và . 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ữ.