คำอธิบายโจทย์
ให้รายการตัวเลข nums ต้องการหาความต่างสูงสุดระหว่างตัวเลขใดตัวเลขหนึ่งกับตัวเลขที่น้อยกว่ามันที่สุด (next smaller number) โดยต้องแก้ในเวลา O(n)
ตัวอย่าง
nums = [14, 2, 6, 35, 12] → เอาต์พุต: 21 (จาก 35 - 14 = 21)
วิธีแก้ปัญหา
ใช้ Bucket Sort / Pigeonhole Principle:
- หาค่า min_val และ max_val ของอาเรย์
- คำนวณ bucket size: delta = (max_val - min_val) / (n - 1)
- กระจายตัวเลขเข้า buckets โดยแต่ละ bucket เก็บค่า min และ max ของช่วงนั้น
- คำตอบต้องมาจาก max ของ bucket ก่อนหน้า - min ของ bucket ถัดไป (ไม่ใช่ภายใน bucket เดียวกัน)
- สแกน buckets ตามลำดับ คำนวณความต่างระหว่าง bucket ที่มีค่า
โค้ด Python
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"))
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)
res = 0
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