每日一题做题记录,参考官方和三叶的题解 |
题目要求
阅读理解
算数组里最大值和最小值的差值,但是可以对这两个数做一定的加减( [ − k , k ] [-k,k] [−k,k]范围内的加减),然后找到加减之后能得到的最小的那差值。
也就是说只要找到最大最小值做处理就好。
思路:数学(模拟)
- 首先找到数组里的最大值最小值;
- 需要最小的差值,那目标就是尽可能把两个数变成一样的,只要 k k k足够大就可以把差值变为 0 0 0;
- 能够变化的数值距离最大为 2 k 2k 2k,所以结果就是差值减去 2 k 2k 2k或者 0 0 0。
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);
}
}
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)
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);
}
};
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)
总结
推导出规律模拟就好了……
四月勋章get√
欢迎指正与讨论! |