Cho danh sách số nums đã sắp xếp không giảm. Kiểm tra xem có thể chia thành các dãy con (subsequence) sao cho mỗi dãy có độ dài ≥ 3 và các phần tử tăng liên tiếp (ví dụ: 2,3,4).
Ví dụ: nums = [2, 3, 4, 4, 5, 6, 7] → tách thành [2,3,4] và [4,5,6,7] → True.
Giải thuật (Đếm tần suất & xác định đoạn)
- Đếm tần suất mỗi số trong
counts. - Xác định các đoạn bắt đầu (
starts) và kết thúc (ends) của các dãy con tiềm năng:- Nếu
count[x] > count[x-1]: cócount[x] - count[x-1]dãy mới bắt đầu tạix. - Nếu
count[x] > count[x+1]: cócount[x] - count[x+1]dãy kết thúc tạix.
- Nếu
- Ghép cặp
(start, end)theo thứ tự, kiểm trastart + 2 <= end(độ dài ≥ 3).
Mã nguồn Python
from collections import Counter
class Solution:
def solve(self, nums):
count = Counter(nums)
starts = []
ends = []
for x in sorted(count):
if count[x] > count.get(x-1, 0):
starts.extend([x] * (count[x] - count.get(x-1, 0)))
if count[x] > count.get(x+1, 0):
ends.extend([x] * (count[x] - count.get(x+1, 0)))
return all(s + 2 <= e for s, e in zip(starts, ends))
ob = Solution()
nums = [2, 3, 4, 4, 5, 6, 7]
print(ob.solve(nums)) # Output: True
Đầu vào
[2, 3, 4, 4, 5, 6, 7]
Đầu ra
True