Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình tìm sự khác biệt tối thiểu có thể có của các chỉ số của các phần tử liền kề trong Python

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