Giả sử chúng ta có ba số dương nói n, dưới và trên. Chúng ta phải tìm một danh sách có độ dài là n và tăng dần rồi giảm dần và tất cả các số đều nằm trong phạm vi [dưới và trên] (cả hai đều bao gồm). Và mỗi phần tăng và giảm không được để trống. Chúng ta phải tìm danh sách từ điển lớn nhất có thể, nếu không thể, hãy trả về danh sách trống.
Vì vậy, nếu đầu vào giống như n =5 thấp hơn =3 trên =7, thì đầu ra sẽ là [6, 7, 6, 5, 4], nếu chúng ta nhìn kỹ, [7, 6, 5, 4, 3 ] không hợp lệ vì phần tăng dần không được để trống.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
nếu n> 2 * (trên - dưới) + 1, thì
-
trả về danh sách trống
-
-
c:=trên - dưới
-
d:=1
-
nếu c
-
d:=n - c - 1
-
-
nếu d giống 0 thì
-
d:=1
-
-
f:=một danh sách mới từ phạm vi từ (trên - d) đến (trên - 1)
-
g:=một danh sách mới từ dải ô (trên - n + d - 1) xuống trên
-
nối f và g và trả về
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau đây để hiểu rõ hơn
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]