Cho mảng nums chứa n-1 số của một cấp số cộng (mất đi một số không phải đầu/cuối). Tìm số bị thiếu.
Ví dụ: nums = [5, 7, 11, 13] → kết quả 9 (công thức 2i+5, i=2 → 9).
Thuật toán giải quyết (Tìm kiếm nhị phân O(log n))
- Nếu độ dài 2: trả về trung bình
- Nếu hai phần tử đầu bằng nhau: cấp số cộng hằng → trả về giá trị đó
- Tính
interval = (last - first) // n(công sai) - Binary search trên mảng: so sánh
nums[mid]với giá trị kỳ vọngfirst + interval*mid - Khi tìm thấy vị trí lệch: trả về giá trị kỳ vọng tại vị trí đó
Ví dụ minh họa
def solve(nums):
if len(nums) == 2:
return sum(nums) // 2
if nums[0] == nums[1]:
return nums[0]
lower = nums[0]
upper = nums[-1]
interval = (upper - lower) // len(nums)
pointer = len(nums) // 2
left = 0
right = len(nums) - 1
while left != right:
if nums[pointer] != nums[0] + interval * pointer:
if nums[pointer - 1] == nums[0] + interval * (pointer - 1):
return nums[0] + interval * pointer
else:
right = pointer
pointer = (left + right) // 2
else:
if right - left == 1:
pointer = right
else:
left = pointer
pointer = (left + right) // 2
nums = [5, 7, 11, 13]
print(solve(nums))
Đầu vào
[5, 7, 11, 13]
Đầu ra
9