1818. 绝对差值和

题目链接 1818. 绝对差值和
思路 排序+二分
题解链接 运用「二分」找最佳替换方案
关键点 转换为查找最小值delta:对nums1进行排序后,从中二分查找nums2[i]的最接近值(考虑到绝对值,需要检查left & right两个位置)
时间复杂度 O(nlogn)
空间复杂度 O(n)

代码实现:

class Solution:
def minAbsoluteSumDiff(self, nums1: List[int], nums2: List[int]) -> int:
total = 0
sorted_ = sorted(nums1)
n = len(nums1)
delta = inf
for i in range(n):
diff = abs(nums1[i] - nums2[i])
total += diff
left, right = -1, n
while left + 1 < right:
mid = (left+right) // 2
if sorted_[mid] < nums2[i]:
left = mid
else:
right = mid
if left >= 0:
delta = min(delta, abs(sorted_[left] - nums2[i]) - diff)
if right < n:
delta = min(delta, abs(sorted_[right] - nums2[i]) - diff)
return (total + delta) % (10 ** 9 + 7)
Python-标准库
class Solution:
def minAbsoluteSumDiff(self, nums1: List[int], nums2: List[int]) -> int:
total = 0
sorted_ = sorted(nums1)
n = len(nums1)
delta = inf
for i in range(n):
diff = abs(nums1[i] - nums2[i])
total += diff
right = bisect_left(sorted_, nums2[i])
left = right-1
if left >= 0:
delta = min(delta, abs(sorted_[left] - nums2[i]) - diff)
if right < n:
delta = min(delta, abs(sorted_[right] - nums2[i]) - diff)
return (total + delta) % (10 ** 9 + 7)
posted @   WrRan  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示