每日一题—— 最小差值 I

简介: 每日一题—— 最小差值 I

908. 最小差值 I

题目描述:

给你一个整数数组 nums,和一个整数 k 。

在一个操作中,您可以选择 0 <= i < nums.length 的任何索引 i 。将 nums[i] 改为 nums[i] + x ,其中 x 是一个范围为 [-k, k] 的整数。对于每个索引 i ,最多 只能 应用 一次 此操作。

nums 的 分数 是 nums 中最大和最小元素的差值。

在对 nums 中的每个索引最多应用一次上述操作后,返回nums的最低 分数 。

大致题意:

通过对现有数组的元素+x(每个元素只有一个次+x的机会),使得新数组的最大值和最小值之间的差值最小。

示例1:

输入:nums = [1], k = 0

输出:0

解释:分数是 max(nums) - min(nums) = 1 - 1 = 0。

示例2:

输入:nums = [0,10], k = 2

输出:6

解释:将 nums 改为 [2,8]。分数是 max(nums) - min(nums) = 8 - 2 = 6

思路:

当原数组的最大值 - 最小值 > 2 * k,那么把最小值 + k,最大值 - k,得到的新数组的最大值和最小值的差最小。

否则,得到的新数组的最大值和最小值的差就是 0(因为x取值是[-k,k],如果你最大和最小相差小于2k,那么你都可以通过在[-k,k]这个范围里,找到值,使数组里的所有元素都变成一样)

题解:

func smallestRangeI(nums []int, k int) int {
  maxNum,minNum := sortNums(nums)
  return max(0, maxNum-k-(minNum+k))
}
func sortNums(nums []int) (max, min int) {
  max = nums[0]
  min = nums[0]
  for i := 0; i < len(nums); i++ {
    if nums[i] > max {
      max = nums[i]
    }
    if nums[i] < min {
      min = nums[i]
    }
  }
  return max, min
}
func max(a, b int) int {
  if a > b {
    return a
  }
  return b
}

提交结果:

相关文章
|
12月前
【Leetcode -746.使用最小花费爬楼梯 -747.至少是其他数字两倍的最大数】
【Leetcode -746.使用最小花费爬楼梯 -747.至少是其他数字两倍的最大数】
67 0
|
2月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
34 0
|
4月前
每日一题 2006. 差的绝对值为 K 的数对数目
每日一题 2006. 差的绝对值为 K 的数对数目
|
5月前
|
人工智能 算法
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
|
5月前
leetcode:908. 最小差值 I
leetcode:908. 最小差值 I
24 0
|
5月前
leetcode-6118:最小差值平方和
leetcode-6118:最小差值平方和
30 0
|
5月前
leetcode-1984:学生分数的最小差值
leetcode-1984:学生分数的最小差值
40 0
每日一题——长度最小的子数组
每日一题——长度最小的子数组
|
算法 C++ Python
【每日算法Day 91】求解数组中出现次数超过1/3的那个数
【每日算法Day 91】求解数组中出现次数超过1/3的那个数
LeetCode 5854. 学生分数的最小差值
给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。
82 0