python-leetcode-908. 最小差值 I

908. 最小差值 I - 力扣(LeetCode)

可以通过调整数组中的元素,使得最大值和最小值尽可能接近,从而最小化最大值与最小值的差值。

解决思路:

  1. 找到数组的最大值和最小值

    • 初始情况下,数组的最大值为 max(nums),最小值为 min(nums),它们的差值为 max(nums) - min(nums)

  2. 通过操作调整数值范围

    • 每个元素 nums[i] 可以调整范围 [-k, k],因此:

      • 最小值 min(nums) 可以增加最多 k,变为 min(nums) + k

      • 最大值 max(nums) 可以减少最多 k,变为 max(nums) - k

  3. 计算可能的最小差值

    • 经过调整后,新的最小值为 min(nums) + k,新的最大值为 max(nums) - k

    • 目标是计算 (max(nums) - k) - (min(nums) + k),即:

      \text{new\_score} = \max(nums) - k - (\min(nums) + k) = \max(nums) - \min(nums) - 2k
    • 但如果 max(nums) - k 变得小于 min(nums) + k,即新的最大值小于新的最小值,我们可以认为数组的所有元素已经可以调整为一个值,那么最小差值就是 0

代码实现:

def smallestRangeI(nums, k):
    return max(0, max(nums) - min(nums) - 2 * k)

# 示例
print(smallestRangeI([1, 3, 6], 3))  # 输出 0
print(smallestRangeI([0, 10], 2))    # 输出 6

复杂度分析:

  • 找到 max(nums)min(nums) 需要 O(n) 时间。

  • 计算公式是 O(1)

  • 总体复杂度:O(n)

示例分析:

示例 1:
nums = [1, 3, 6], k = 3
max(nums) = 6, min(nums) = 1
计算:max(0, (6 - 1) - 2 * 3) = max(0, 5 - 6) = max(0, -1) = 0
示例 2:
nums = [0, 10], k = 2
max(nums) = 10, min(nums) = 0
计算:max(0, (10 - 0) - 2 * 2) = max(0, 10 - 4) = max(0, 6) = 6

这样,我们可以在 O(n) 时间内求解最小的分数。 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值