Cho mảng nums và danh sách truy vấn queries (mỗi truy vấn [i,j]). Kiểm tra dãy con nums[i:j+1] có phải dãy số học không. Đếm số truy vấn trả về True.
Ví dụ: nums=[2,4,6,8,7,6,5,2], queries=[[3,4],[0,3],[2,4]] → 2 (dãy [2,4,6,8] và [8,7] là số học).
Giải thuật (Run-length encoding độ chênh lệch)
- Tính mảng
diff[i] = nums[i+1] - nums[i] - Tính
rle[i]= độ dài dãy con kết thúc tạiicódiffgiống nhau - Truy vấn
[i,j]là số học nếurle[j-1] >= j-i(hoặci==j)
Ví dụ triển khai
def solve(nums, queries):
if not nums:
return 0
n = len(nums)
diff = [nums[i+1] - nums[i] for i in range(n-1)]
rle = [0] * (n-1)
for i in range(n-1):
if i > 0 and diff[i] == diff[i-1]:
rle[i] = rle[i-1] + 1
else:
rle[i] = 1
ans = 0
for i, j in queries:
if i == j:
ans += 1
else:
ans += rle[j-1] >= (j - i)
return ans
print(solve([2,4,6,8,7,6,5,2], [[3,4],[0,3],[2,4]]))
Đầu vào
[2,4,6,8,7,6,5,2], [[3,4],[0,3],[2,4]]
Đầu ra
2