Giả sử chúng ta có một dãy nums, một đoạn đường nối là một bộ (i, j) mà i
Vì vậy, nếu đầu vào giống như nums =[6,0,8,2,1,5], thì đầu ra sẽ là 4 vì độ rộng tối đa đạt được tại (i, j) =(1,5) và nums [1] =0 và nums [5] =5.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
B:=một bản đồ mới
đối với tôi trong phạm vi từ 0 đến kích thước của nums, hãy thực hiện
x:=nums [i]
nếu x nằm trong B thì
chèn i vào cuối B [x]
nếu không,
B [x]:=[i]
mini:=một danh sách ban đầu lưu trữ một thông tin vào đó
maxi:=một danh sách ban đầu lưu trữ một -inf vào đó
cho mỗi x trong danh sách danh sách tất cả các khóa của B, làm
chèn tối thiểu phần tử cuối cùng của mini và tối thiểu B [x] vào cuối mini
đối với mỗi x trong danh sách được sắp xếp lại của tất cả các khóa của B, thực hiện
chèn tối thiểu phần tử cuối cùng của mini và tối thiểu B [x] vào cuối mini
maxi:=reverse maxi rồi lấy mảng con từ phần tử đầu tiên đến phần tử cuối cùng thứ hai
mini:=subarray của mini [từ chỉ mục 1 đến cuối]
p:=0
res:=-inf
while p
res:=tối đa của res và (maxi [p] - mini [p])
p:=p + 1
trả lại res
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
def solve(nums):
B = {}
for i in range(len(nums)):
x = nums[i]
if x in B:
B[x].append(i)
else:
B[x] = [i]
mini = [float('inf')]
maxi = [float('-inf')]
for x in sorted(B.keys()):
mini.append(min(mini[-1], min(B[x])))
for x in sorted(B.keys(), reverse = True):
maxi.append(max(maxi[-1], max(B[x])))
maxi = maxi[::-1][:-1]
mini = mini[1:]
p = 0
res = float('-inf')
while p < len(mini):
res = max(res, maxi[p] - mini[p])
p += 1
return res
nums = [6,0,8,2,1,5]
print(solve(nums))
Đầu vào
[6,0,8,2,1,5]
Đầu ra
4