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

Chương trình tìm sự khác biệt lớn nhất của bất kỳ số nào và số nhỏ hơn tiếp theo của nó trong Python

Giả sử chúng ta có một danh sách các số được gọi là num, chúng ta phải tìm sự khác biệt lớn nhất tồn tại giữa bất kỳ số nào và số nhỏ hơn tiếp theo. Mục tiêu của chúng tôi là giải quyết vấn đề này trong thời gian tuyến tính.

Vì vậy, nếu đầu vào là nums =[14, 2, 6, 35, 12], thì đầu ra sẽ là 21, vì 35 và 14 có chênh lệch lớn nhất là 21.

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

  • max_val:=tối đa nums, min_val:=tối thiểu nums

  • nếu max_val giống với min_val thì

    • trả về 0

  • delta:=(max_val - min_val) / (kích thước của nums - 1)

  • min_map:=một bản đồ trống (nếu một số giá trị không có thì giá trị trả về dưới dạng inf)

  • max_map:=một bản đồ trống (nếu một số giá trị không có thì giá trị trả về là −inf)

  • res:=0, idx:=0

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

    • idx:=tầng của ((num - min_val) / delta)

    • max_map [idx]:=tối đa của max_map [idx] và num

    • min_map [idx]:=tối thiểu của min_map [idx] và num

  • trước:=min_val

  • đối với tôi trong phạm vi từ 0 đến kích thước của nums - 1, thực hiện

    • nếu min_map [i] không giống với inf thì

      • res:=tối đa của res và (min_map [i] - pres)

      • trước:=max_map [i]

  • 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ụ

from collections import defaultdict
import math
class Solution:
   def solve(self, nums):
      max_val = max(nums)
      min_val = min(nums)
      if max_val == min_val:
         return 0
      delta = (max_val − min_val) / (len(nums) − 1)
      min_map = defaultdict(lambda: float("inf"))
      max_map = defaultdict(lambda: float("−inf"))
      res = 0
      idx = 0
      for num in nums:
         idx = math.floor((num − min_val) / delta)
         max_map[idx] = max(max_map[idx], num)
         min_map[idx] = min(min_map[idx], num)
      prev = min_val
      for i in range(len(nums)):
         if min_map[i] != float("inf"):
            res = max(res, min_map[i] − prev)
            prev = max_map[i]
      return res
ob = Solution()
nums = [14, 2, 6, 35, 12]
print(ob.solve(nums))

Đầu vào

[14, 2, 6, 35, 12]

Đầu ra

21