Đi bộ từ trái sang phải, sử dụng ngăn xếp để theo dõi màu sắc bạn đang mặc. Thay vì một bản đồ riêng biệt, hãy sử dụng 10 số trong tập dữ liệu của bạn làm điểm dừng.
Bắt đầu với một ngăn xếp trống và đặt start
thành 0, lặp cho đến khi chúng ta kết thúc:
- Nếu ngăn xếp trống:
- Tìm kiếm màu đầu tiên bắt đầu tại hoặc sau đó
start
, và đẩy nó và tất cả các màu được xếp hạng thấp hơn lên ngăn xếp. Trong danh sách làm phẳng của bạn, đánh dấu sự bắt đầu của màu đó.
- khác (Nếu không trống):
- Tìm điểm bắt đầu tiếp theo cho bất kỳ màu nào được xếp hạng cao hơn tại hoặc sau
start
và tìm điểm kết thúc của màu hiện tại
- Nếu màu tiếp theo bắt đầu trước, đẩy nó và bất cứ thứ gì khác trên đường đến nó lên ngăn xếp. Cập nhật phần cuối của màu hiện tại làm phần đầu của màu này và thêm phần bắt đầu của màu này vào danh sách dẹt.
- Nếu không có màu nào và màu hiện tại kết thúc trước, hãy đặt thành
start
cuối màu này, bật nó ra khỏi ngăn xếp và kiểm tra màu được xếp hạng cao nhất tiếp theo
- Nếu
start
nằm trong phạm vi của màu tiếp theo, hãy thêm màu này vào danh sách làm phẳng, bắt đầu từ start
.
- Nếu ngăn xếp trống, chỉ cần tiếp tục vòng lặp (quay trở lại điểm đầu tiên).
Đây là một sự cố gắng thông qua dữ liệu mẫu của bạn:
# Initial data.
flattened = []
stack = []
start = 0
# Stack is empty. Look for the next starting point at 0 or later: "b", 0 - Push it and all lower levels onto stack
flattened = [ (b, 0, ?) ]
stack = [ r, b ]
start = 0
# End of "b" is 5.4, next higher-colored start is "g" at 2 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, ?) ]
stack = [ r, b, g ]
start = 2
# End of "g" is 12, next higher-colored start is "y" at 3.5 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, ?) ]
stack = [ r, b, g, y ]
start = 3.5
# End of "y" is 6.7, next higher-colored start is "o" at 6.7 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, ?) ]
stack = [ r, b, g, y, o ]
start = 6.7
# End of "o" is 10, and there is nothing starting at 12 or later in a higher color. Next off stack, "y", has already ended. Next off stack, "g", has not ended. Delimit and continue.
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, ?) ]
stack = [ r, b, g ]
start = 10
# End of "g" is 12, there is nothing starting at 12 or later in a higher color. Next off stack, "b", is out of range (already ended). Next off stack, "r", is out of range (not started). Mark end of current color:
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12) ]
stack = []
start = 12
# Stack is empty. Look for the next starting point at 12 or later: "r", 12.5 - Push onto stack
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12), (r, 12.5, ?) ]
stack = [ r ]
start = 12
# End of "r" is 13.8, and there is nothing starting at 12 or higher in a higher color. Mark end and pop off stack.
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12), (r, 12.5, 13.8) ]
stack = []
start = 13.8
# Stack is empty and nothing is past 13.8 - We're done.