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

Chương trình tìm dãy con dài nhất trong đó sự khác biệt tuyệt đối giữa mọi phần tử liền kề tối đa là k trong Python.


Giả sử chúng ta được cung cấp một danh sách các số và một giá trị k khác. Lần này, nhiệm vụ của chúng ta là tìm độ dài của dãy con dài nhất mà hiệu số tuyệt đối giữa mọi phần tử liền kề tối đa là k.

Vì vậy, nếu đầu vào là nums =[5, 6, 2, 1, −6, 0, −1, k =4, thì đầu ra sẽ là 6.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định một bản cập nhật hàm (). Điều này sẽ đưa tôi, x

  • i:=i + n

  • trong khi tôi khác 0, hãy làm

    • segtree [i]:=tối đa segtree [i], x

    • i:=i / 2

  • Xác định một truy vấn hàm (). Điều này sẽ mất tôi, j

  • ans:=−infinity

  • i:=i + n

  • j:=j + n + 1

  • trong khi i

    • nếu tôi mod 2 giống với 1, thì

      • ans:=tối đa ans, segtree [i]

      • i:=i + 1

    • nếu j mod 2 giống với 1 thì

      • j:=j - 1

      • ans:=tối đa ans, segtree [j]

    • i:=i / 2

    • j:=j / 2

  • trả lại ans

  • Bây giờ, trong chức năng chính, hãy làm như sau -

  • nums =[5, 6, 2, 1, −6, 0, −1]

  • k =4

  • n =2 thành lũy thừa (logarit cơ số 2 của (độ dài của (nums) + 1) + 1)

  • segtree:=[0] * 100000

  • snums:=sắp xếp các số trong danh sách

  • index:=tạo một tập hợp trong đó x:i cho mỗi chỉ mục i và phần tử x trong (snums)

  • ans:=0

  • đối với mỗi x trong số, thực hiện

    • lo:=trả về vị trí ngoài cùng bên trái từ snums, trong đó (x - k) có thể được chèn vào trong khi vẫn duy trì thứ tự đã sắp xếp

    • chào:=(vị trí ngoài cùng bên trái của snums, trong đó (x + k) có thể được chèn vào trong khi vẫn duy trì thứ tự đã sắp xếp) - 1

    • count:=query (lo, hi)

    • cập nhật (chỉ mục [x], đếm + 1)

    • ans:=tối đa ans, đếm + 1

  • trả lại ans

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

Ví dụ

import math, bisect
class Solution:
   def solve(self, nums, k):
      n = 2 ** int(math.log2(len(nums) + 1) + 1)
      segtree = [0] * 100000
      def update(i, x):
         i += n
         while i:
            segtree[i] = max(segtree[i], x)
            i //= 2
         def query(i, j):
            ans = −float("inf")
            i += n
            j += n + 1
            while i < j:
               if i % 2 == 1:
                  ans = max(ans, segtree[i])
                  i += 1
               if j % 2 == 1:
                  j −= 1
                  ans = max(ans, segtree[j])
               i //= 2
               j //= 2
            return ans
         snums = sorted(nums)
         index = {x: i for i, x in enumerate(snums)}
         ans = 0
         for x in nums:
            lo = bisect.bisect_left(snums, x − k)
            hi = bisect.bisect_right(snums, x + k) − 1
            count = query(lo, hi)
            update(index[x], count + 1)
            ans = max(ans, count + 1)
      return ans
ob = Solution()
print(ob.solve([5, 6, 2, 1, −6, 0, −1], 4))

Đầu vào

[5, 6, 2, 1, −6, 0, −1], 4

Đầu ra

6