สมมติว่าเรามีรายการของตัวเลขที่เรียกว่า nums เราต้องหาความแตกต่างสูงสุดที่มีอยู่ระหว่างตัวเลขใดๆ กับจำนวนที่น้อยกว่าถัดไป เป้าหมายของเราคือการแก้ปัญหานี้ในเวลาเชิงเส้น
ดังนั้น หากอินพุตมีค่าเท่ากับ nums =[14, 2, 6, 35, 12] ผลลัพธ์จะเป็น 21 เนื่องจาก 35 และ 14 มีความแตกต่างมากที่สุดคือ 21
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
max_val :=สูงสุดของ nums, min_val :=ขั้นต่ำของ nums
-
ถ้า max_val เหมือนกับ min_val แล้ว
-
คืนค่า 0
-
-
เดลต้า :=(max_val − min_val) / (ขนาดของ nums − 1)
-
min_map :=แผนที่ว่าง (ถ้าค่าบางค่าไม่มีให้คืนค่าเป็น inf)
-
max_map :=แผนที่ว่าง (หากบางค่าไม่มีค่าส่งคืนเป็น −inf)
-
res :=0, idx :=0
-
สำหรับแต่ละ num เป็น num ทำ
-
idx :=พื้นของ ((num − min_val) / delta)
-
max_map[idx] :=สูงสุดของ max_map[idx] และ num
-
min_map[idx] :=ขั้นต่ำของ min_map[idx] และ num
-
-
ก่อนหน้า :=min_val
-
สำหรับฉันในช่วง 0 ถึงขนาดของ nums − 1 ทำ
-
ถ้า min_map[i] ไม่เหมือนกับ inf แล้ว
-
res :=สูงสุดของ res และ (min_map[i] − ก่อนหน้า)
-
ก่อนหน้า :=max_map[i]
-
-
-
ผลตอบแทน
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
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))
อินพุต
[14, 2, 6, 35, 12]
ผลลัพธ์
21