LeetCode刷题-最小差值I
2021-07-01 本文已影响0人
小鲨鱼FF
前言说明
算法学习,日常刷题记录。
题目连接
题目内容
给你一个整数数组A,请你给数组中的每个元素A[i]都加上一个任意数字x(-K <= x <= K),从而得到一个新数组B。
返回数组B的最大值和最小值之间可能存在的最小差值。
示例1:
输入:A = [1], K = 0
输出:0
解释:B = [1]
示例2:
输入:A = [0,10], K = 2
输出:6
解释:B = [2,8]
示例3:
输入:A = [1,3,6], K = 3
输出:0
解释:B = [3,3,3] 或 B = [4,4,4]
提示:
1 <= A.length <= 10000
0 <= A[i] <= 10000
0 <= K <= 10000
分析过程
遍历数组A,找到最小值和最大值。
如果数组A的最大值和最小值的差值小于等于k的2倍,那么数组A的最小值可以移动n1位,最大值可以移动n2位,其中n1和n2的绝对值小于等于k。
我们可以发现,总能使得数组A的最大值和最小值相等,只要n1和n2一个多点一个少点,就能使得最大值和最小值相等,所以数组B的最小差值是0。
如果数组A的最大值和最小值的差值大于k的2倍,那么数组A的最小值加k,最大值减k,最大值和最小值对着靠拢,就会得到数组B的最小差值。
因为差值大于k的2倍,所以即使最小值和最大值都移动k,也不会出现移动到交叉的情况,而最小差值刚好等于max - min - K * 2。
解答代码
class Solution {
public int smallestRangeI(int[] A, int K) {
// 定义最小值和最大值
int min = A[0], max = A[0];
// 遍历数组A,找到最小值和最大值
for (int e : A) {
if (e < min) {
// 更新最小值
min = e;
}
if (e > max) {
// 更新最大值
max = e;
}
}
if (max - min <= K * 2) {
// 若数组A的最大值和最小值的差值小于等于k的2倍,那么数组A的最小值和最大值一加一减小于等于k绝对值的某个数,总能使得数组A的最大值和最小值相等,所以数组B的最小差值为0
return 0;
} else {
// 若数组A的最大值和最小值的差值大于k的2倍,那么数组A的最小值和最大值一加一减k就会得到数组B的最小差值
return max - min - K * 2;
}
}
}
提交结果
执行用时1ms,时间击败100.00%的用户,内存消耗38.9MB,空间击败26.89%的用户。

原文链接
原文链接:最小差值I