Leetcode 每日一题 2022.04.30

题目

每日一题 908. 最小差值 I

给你一个整数数组 nums,和一个整数 k 。
在一个操作中,您可以选择 0 <= i < nums.length 的任何索引 i 。将 nums[i] 改为 nums[i] + x ,其中 x 是一个范围为 [ − k , k ] [-k, k] [k,k] 的整数。对于每个索引 i ,最多 只能 应用 一次 此操作。
nums 的 分数 是 nums 中最大和最小元素的差值。
在对 nums 中的每个索引最多应用一次上述操作后,返回 nums 的最低 分数

思路

假设数组已经排序完成,由分数的定义知最低分一定是使用 最小数与最大数计算得出。最小数 m i n min min 的浮动区间为 [ m i n − k , m i n + k ] [min-k, min+k] [mink,min+k],最大数 m a x max max 浮动区间为 [ m a x − k , m a x + k ] [max-k, max+k] [maxk,max+k]

m i n + k > m a x − k min+k > max - k min+k>maxk,则存在 k k k,使 m i n + k = m a x − k min + k = max - k min+k=maxk,即最低分数为 0 0 0

m i n + k ≤ m a x − k min+k \leq max - k min+kmaxk,则最低分数为 ( m a x − k ) − ( m i n − k ) (max - k) - (min - k) (maxk)(mink)

代码


class Solution {
public:
    int smallestRangeI(vector<int>& nums, int k) {
        int min(INT_MAX), max(-1);
        for (auto num: nums) {
            if (num < min) {
                min = num;
            }

            if (num > max) {
                max = num;
            }
        }

        return (max - k < min + k)? 0: (max - min - 2 * k);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值