Cho ba số dương n, lower, upper. Tìm danh sách độ dài n tăng chặt rồi giảm chặt, mọi phần tử trong [lower, upper], cả phần tăng và giảm đều không rỗng. Trả về danh sách lớn nhất theo thứ tự từ điển (lexicographically largest), hoặc rỗng nếu không tồn tại.
Ví dụ: n = 5, lower = 3, upper = 7 → kết quả [6, 7, 6, 5, 4]. Lưu ý [7,6,5,4,3] không hợp lệ vì phần tăng rỗng.
Thuật toán giải quyết
- Nếu
n > 2*(upper-lower) + 1: trả về[](không đủ phạm vi) c = upper - lower,d = 1- Nếu
c < n:d = n - c - 1 - Nếu
d == 0:d = 1 - Phần tăng:
f = range(upper-d, upper) - Phần giảm:
g = range(upper, upper-n+d, -1) - Trả về
f + g
Ví dụ minh họa
def solve(n, lower, upper):
if n > 2 * (upper - lower) + 1:
return []
c = upper - lower
d = 1
if c < n:
d = n - c - 1
if d == 0:
d = 1
f = list(range(upper - d, upper))
g = list(range(upper, upper - n + d, -1))
return f + g
n = 5
lower = 3
upper = 7
print(solve(n, lower, upper))
Đầu vào
5, 3, 7
Đầu ra
[6, 7, 6, 5, 4]