题目 :

Given an array A of integers, for each integer A[i] we may choose any x with -K <= x <= K, and add x to A[i].

After this process, we have some array B.

Return the smallest possible difference between the maximum value of B and the minimum value of B.

 Example 1:

Input: A = [1], K = 0
Output: 0
Explanation: B = [1]
Example 2: Input: A = [0,10], K = 2
Output: 6
Explanation: B = [2,8]
Example 3: Input: A = [1,3,6], K = 3
Output: 0
Explanation: B = [3,3,3] or B = [4,4,4]

解题思路 :

因为题目希望 从所有数组B中,计算出所有最大值和最小值的差值,并从中取最小的差值

所以我们的目标是使数组B中的 最大值尽可能小,最小值尽可能大

第一步确定最大值里,最小的,因为max元素最多只能减小到 max - K, 所以最大值不可能小于 max - K

第二步确定最小值里,最大的,因为min元素最多只能增加到 min + K, 所以最小值不可能大于 min + K

比较max - K 和 min + K

如果max - K <= min + K, 其他元素的取值范围正好可以覆盖[max - K, min + K]的区间, 因为每一个元素a[i], a[i] + K >= min + K, a[i] - K <= max - K

说明所有元素可以取到相同值,则最大值和最小值差距可以为0

如果max - K > min + K, 则由于最小的最大值为max - K, 最大的最小值为min + K,

则差距为 max - min - 2 * K

c++代码

class Solution {
public:
//how to prove this process
//min min + k
//max max - k
//如果min + k >= max - k 其它元素的取值范围一定是可以覆盖min + k, max - k
//所以是最小值是0
//如果min + k < max - k 则最大和最小的差值 = max - min - 2 * k
int smallestRangeI(vector<int>& A, int K) {
//edge case
int minV = INT_MAX;
int maxV = INT_MIN;
for (int d : A) {
minV = min(d, minV);
maxV = max(d, maxV);
} int ans = 0;
if (maxV - K <= minV + K) return ans; return maxV - minV - 2 * K;
}
};

java代码

class Solution {
public int smallestRangeI(int[] A, int K) {
int minV = Integer.MAX_VALUE;
int maxV = Integer.MIN_VALUE;
int ans = 0;
for (int d : A) {
minV = Math.min(minV, d);
maxV = Math.max(maxV, d);
} if (minV + K >= maxV - K) return ans;
return maxV - minV - 2 * K;
}
}

最新文章

  1. 【MSP是什么】MSP认证之项目群管理学习总结
  2. C#同一项目中不同文件或类中的方法进行调用
  3. JUnit4测试简介
  4. ubuntu14.04切换root用户
  5. 纯CSS3制作卡通场景汽车动画效果
  6. Codeforces Round #288 (Div. 2) C. Anya and Ghosts 模拟
  7. EasyUI学习笔记
  8. C#中的枚举类型(enum type)
  9. Nginx - Windows下Nginx基本安装和配置
  10. PHPExcel说明
  11. 通用线程:POSIX 线程详解,第 3 部分 条件互斥量(pthread_cond_t)
  12. Qml 写的弹出层控件(13篇博客)
  13. fail2ban防止SSH暴力破解
  14. 手把手 git建立仓库,远程推拉及常用git命令和部分Linux命令集锦
  15. git总结三、关于分支下——团队合作中最重要的合并分支
  16. npm版本安装问题
  17. bzoj 4503
  18. [Android Studio] Using Java to call OpenCV
  19. kickstart模式实现批量安装centos7.x系统
  20. MYSQL如何解决幻读

热门文章

  1. jQuery progression 表单进度
  2. Qt 编译完后指定输出路径
  3. JAVA使用ItextPDF
  4. hadoop之 Hadoop1.x和Hadoop2.x构成对比
  5. UOJ 348 【WC2018】州区划分——子集卷积
  6. bzoj2957楼房重建
  7. 4.Appium实现自动化安装apk
  8. Phonegap 通知 Notification
  9. XP IE8 安装失败
  10. 智能家居入门DIY——【三、GP2Y10之颗粒物传感器】