| 每日一题做题记录,参考官方和三叶的题解 |
题目要求
阅读理解
算数组里最大值和最小值的差值,但是可以对这两个数做一定的加减(范围内的加减),然后找到加减之后能得到的最小的那差值。
也就是说只要找到最大最小值做处理就好。
思路:数学(模拟)
- 首先找到数组里的最大值最小值;
- 需要最小的差值,那目标就是尽可能把两个数变成一样的,只要足够大就可以把差值变为;
- 能够变化的数值距离最大为,所以结果就是差值减去或者。
Java
class Solution {
public int smallestRangeI(int[] nums, int k) {
int max = nums[0], min = nums[0];
for(int i : nums) {
max = Math.max(max, i);
min = Math.min(min, i);
}
return Math.max(0, max - min - 2 * k);
}
}
- 时间复杂度:
- 空间复杂度:
C++
【注意变量命名会和函数重了然后报错,才不是偷懒直接copy了Java代码】
class Solution {
public:
int smallestRangeI(vector<int>& nums, int k) {
int maxx = nums[0], minn = nums[0];
for(int i : nums) {
maxx = max(maxx, i);
minn = min(minn, i);
}
return max(0, maxx - minn - 2 * k);
}
};
- 时间复杂度:
- 空间复杂度:
总结
推导出规律模拟就好了……
四月勋章get√
| 欢迎指正与讨论! |