Cho danh sách số nums. Đếm số dãy con liên tiếp (contiguous subarray) độ dài ≥ 3 là cấp số cộng.
Ví dụ
nums = [6, 8, 10, 12, 13, 14]
Các dãy cấp số cộng liên tiếp độ dài ≥ 3:
- [6, 8, 10] (diff=2)
- [8, 10, 12] (diff=2)
- [6, 8, 10, 12] (diff=2, độ dài 4)
- [12, 13, 14] (diff=1)
Kết quả: 4.
Thuật toán (Đếm độ dài dãy cấp số cộng liên tiếp)
- Khởi tạo
count = 0(độ dài dãy cấp số cộng hiện tại - 2),ans = 0. - Duyệt
itừ 2 đến n-1:- Nếu
nums[i] - nums[i-1] == nums[i-1] - nums[i-2]:count++. - Ngược lại:
ans += count * (count + 1) // 2, resetcount = 0.
- Nếu
- Sau vòng lặp:
ans += count * (count + 1) // 2. - Trả về
ans.
Công thức: dãy cấp số cộng độ dài L có (L-2)*(L-1)/2 dãy con độ dài ≥ 3.
Triển khai Python
class Solution:
def solve(self, nums):
count = 0
ans = 0
for i in range(2, len(nums)):
if nums[i] - nums[i-1] == nums[i-1] - nums[i-2]:
count += 1
else:
ans += count * (count + 1) // 2
count = 0
if count:
ans += count * (count + 1) // 2
return ans
# Test
ob = Solution()
print(ob.solve([6, 8, 10, 12, 13, 14])) # Output: 4
Độ phức tạp
- Thời gian: O(n).
- Không gian: O(1).
Bài toán "Arithmetic Slices" (LeetCode 413).