python-022Đọc toàn bộ đề miễn phí

Dãy con tăng dài nhất trong O(N log N)

Hệ thống đánh giá hiệu năng huấn luyện mô hình tại AI Empire Academy ghi lại chỉ số Accuracy qua các epoch thành một mảng số thực/số nguyên nums. Cần tìm độ dài lớn nhất của một ch…

PythonNâng cao30 phút

Tiến độ của tôi ở bài này

Điểm được lưu vào tài khoản sau khi chấm bài.

Đang tải điểm của bạn…

Kiến thức và chủ đề

dynamic programmingbinary searchpatience sortinglis

Kiến thức tiên quyết: bisect module, binary search, dp concept.

Nội dung đề bài

Mục tiêu kiến thức

  • Hiểu hạn chế của giải thuật Quy hoạch động LIS kinh điển O(N2) khi dữ liệu lớn.
  • Nắm vững thuật toán Xếp bài kiên nhẫn (Patience Sorting) kết hợp Tìm kiếm nhị phân bisect_left.
  • Đạt độ phức tạp thời gian O(N log N) để vượt qua giới hạn N = 105 phần tử trong 1.0 giây.

Mô tả bài toán

Hệ thống đánh giá hiệu năng huấn luyện mô hình tại AI Empire Academy ghi lại chỉ số Accuracy qua các epoch thành một mảng số thực/số nguyên nums. Cần tìm độ dài lớn nhất của một chuỗi các epoch có hiệu năng tăng trưởng nghiêm ngặt liên tục (dãy con không nhất thiết phải liền kề).

Hãy viết hàm length_of_lis(nums: list[int]) -> int trả về độ dài của dãy con tăng nghiêm ngặt dài nhất (Longest Increasing Subsequence - LIS).

Quy tắc thuật toán Patience Sorting:

  • Duy trì mảng tails với tails[i] là phần tử nhỏ nhất kết thúc một dãy con tăng độ dài i + 1.
  • Mảng tails luôn được duy trì tăng dần nghiêm ngặt.
  • Với mỗi phần tử x trong nums:
  • Dùng tìm kiếm nhị phân (bisect_left) tìm vị trí idx đầu tiên trong tails sao cho tails[idx] >= x.
  • Nếu tìm thấy, ghi đè tails[idx] = x.
  • Nếu không tìm thấy (tức x > mọi phần tử trong tails), mở rộng mảng tails.append(x).
  • Độ dài LIS chính là len(tails).

Input

Danh sách các số nguyên nums.

Output

Số nguyên int là độ dài của dãy con tăng dài nhất.

Ràng buộc

  • 0 ≤ len(nums) ≤ 105.
  • -109 ≤ nums[i] ≤ 109.
  • Thời gian chạy tối đa: 1000ms.
  • Giới hạn bộ nhớ: 256MB.

Ví dụ 1

Input

`nums = [10, 9, 2, 5, 3, 7, 101, 18]`

Output

`4`

Giải thích

Dãy con tăng dài nhất là [2, 3, 7, 101] (hoặc [2, 5, 7, 101]), có độ dài bằng 4.

Ví dụ 2

Input

`nums = [0, 1, 0, 3, 2, 3]`

Output

`4`

Giải thích

Dãy con tăng dài nhất là [0, 1, 2, 3], độ dài bằng 4.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.