Giả sử chúng ta có một danh sách các số num, chúng ta có thể nói rằng hai số nums [i] ≤ nums [j] là kề nhau khi không có số nào ở giữa (nums [i], nums [j]) trong nums. Chúng ta phải tìm giá trị nhỏ nhất có thể | j - i | sao cho nums [j] và nums [i] liền kề.
Vì vậy, nếu đầu vào giống như nums =[1, -9, 6, -6, 2], thì đầu ra sẽ là 2, vì chúng ta có thể thấy rằng 2 và 6 liền kề và chúng cách xa nhau 2 chỉ số.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
indexes:=một bản đồ mới
-
đối với mỗi chỉ số i và giá trị x trong A, thực hiện
-
chèn i vào cuối chỉ mục [x]
-
-
ans:=kích thước của A
-
đối với mỗi hàng trong danh sách tất cả các giá trị của chỉ mục, hãy thực hiện
-
đối với tôi trong phạm vi từ 0 đến kích thước của hàng - 2, thực hiện
-
ans:=tối thiểu ans và (row [i + 1] - row [i])
-
-
-
vals:=sắp xếp các chỉ mục danh sách
-
đối với k trong phạm vi 0 đến kích thước của vals - 2, thực hiện
-
r1:=indexes [vals [k]]
-
r2:=indexes [vals [k + 1]]
-
i:=j:=0
-
while i
-
ans:=tối thiểu ans và | r1 [i] - r2 [j] |
-
nếu r1 [i]
-
i:=i + 1
-
-
nếu không,
-
j:=j + 1
-
-
-
-
trả lại ans
Ví dụ (Python)
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
from collections import defaultdict class Solution: def solve(self, A): indexes = defaultdict(list) for i, x in enumerate(A): indexes[x].append(i) ans = len(A) for row in indexes.values(): for i in range(len(row) - 1): ans = min(ans, row[i + 1] - row[i]) vals = sorted(indexes) for k in range(len(vals) - 1): r1 = indexes[vals[k]] r2 = indexes[vals[k + 1]] i = j = 0 while i < len(r1) and j < len(r2): ans = min(ans, abs(r1[i] - r2[j])) if r1[i] < r2[j]: i += 1 else: j += 1 return ans ob = Solution() nums = [1, -9, 6, -6, 2] print(ob.solve(nums))
Đầu vào
[1, -9, 6, -6, 2]
Đầu ra
2