Hai điều kiện cần được kiểm cùng lúc
Bộ ba cần lấy từ các vị trí i,i+1,i+2 liền nhau. Ba giá trị phải tăng đều1 hoặc giảm đều1, chẳng hạn(2,3,4)hoặc(4,3,2). Không chọn ba phần tử cách nhau chỉ vì giá trị của chúng liên tiếp.
Duyệt i từ 0 đến len(A)−3, tương ứng range(len(A)−2). Dịch i từng đơn vị để không bỏ các bộ có chung phần tử; dãy ngắn hơn 3 phần tử không có bộ ba để xét.
Giữ chỉ số đầu để nhận biết từng bộ
```python
def consecutive_triples(A):
result = []
for i in range(len(A) - 2):
up = A[i + 1] == A[i] + 1 and A[i + 2] == A[i + 1] + 1
down = A[i + 1] == A[i] - 1 and A[i + 2] == A[i + 1] - 1
if up or down:
result.append((i, (A[i], A[i + 1], A[i + 2])))
return result
```
Với A=[2,3,4,3,2,7,8,9], có ba bộ: chỉ số đầu 0 ứng với(2,3,4), đầu 2 ứng với(4,3,2), đầu 5 ứng với(7,8,9). Kết quả lưu cả chỉ số đầu và bộ giá trị.
Chạy chế độ bo-ba với dãy trên để nhận số bộ3. Thử [1,2,3,4]: cần giữ cả(1,2,3)và(2,3,4), không nhảy i mỗi lần 3 vị trí sau khi tìm thấy một bộ. Thử dãy rỗng, hai phần tử, bộ bằng nhau và bộ đổi chiều ở giữa.
Bài luyện
Với [1,2,3,4], có bao nhiêu bộ ba cần nhận?
Sẽ thiếu một bộ có chung phần tử với bộ đầu.
Chỉ có hai vị trí đầu đủ ba phần tử.
Số phần tử khác số bộ ba.
Hai bộ ở chỉ số đầu 0 và 1 đều tăng đều1.
Lời giải
Xét i=0 có(1,2,3);i=1 có(2,3,4). Hai bộ đều hợp lệ dù chung hai phần tử, nên số bộ là 2.
Bài luyện
Bộ ba(2,3,2)có thỏa điều kiện không?
Bước đầu tăng1, bước sau giảm1.
Bài yêu cầu ba số liên tiếp theo thứ tự tăng hoặc giảm.
Còn phải kiểm quan hệ giá trị.
Không có điều kiện phải lớn hơn 3.
Lời giải
Tăng cần3=2+1 và 2=3+1, điều thứ hai sai. Giảm cũng không đúng ngay bước đầu. Vì vậy bộ đổi chiều này không được nhận.
Bài luyện
Vì sao phải tăng vị trí đầu mỗi lần 1 thay vì 3?
Bài cần kiểm dữ liệu gốc, không đổi thứ tự.
Nhảy3 có thể bỏ bộ bắt đầu ngay sau bộ vừa nhận.
Mỗi bộ vẫn gồm ba phần tử.
Miền i đã giới hạn để không vượt biên.
Lời giải
Các cửa sổ ba vị trí liên tiếp có thể cùng dùng một hoặc hai phần tử. Dịch đầu từng vị trí mới xét đủ mọi cửa sổ của dãy.
Đang học