Problem
Given an array A of integers, for each integer A[i] we need to choose either x = -K or x = K, and add x to A[i] **(only once)**.
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:
1 | Input: A = [1], K = 0 |
Example 2:
1 | Input: A = [0,10], K = 2 |
Example 3:
1 | Input: A = [1,3,6], K = 3 |
Note:
1 <= A.length <= 100000 <= A[i] <= 100000 <= K <= 10000
Analysis
这道题目是Smallest Range的系列题,第一道系列题比较简单,因为可以加减[-K, K]中的任何一个数字,所以只需要最小值加上K,最大值减去-K,两者再作差和0取最小值,就能找到最小的range。但是这道题目就比较复杂,因为只能加减两个数,所以数组中任何一个数字加减后都有可能成为新的最大值(最小)。
为了让差值较小,我们希望用一个较小的数字加上K,用一个较大的数字减去K。我们先对数组进行排序,然后在i位置把数组一分为二,前面较小的加上K,后面较大的减去K。在前半部分[0, i]中,最大值是A[i] + K,最小值是A[0] + K;在后半部分[i + 1, size - 1]中,最大值是A[size - 1] - K,最小值是A[i + 1] - K,所以整个数组的最大值是max(A[i] + K, A[size - 1] - K),最小值是min(A[0] + K, A[i + 1] - K)。因为A[0] + K和A[size - 1] - K是确定的,所以我们只需要遍历i,每次都计算出range,然后记录下最小的一个即可。
Solution
无
Code
1 | class Solution { |
Summary
这道题是数组类型中计算range的题目,本质上是一个确定最大最小值的问题,这道题目的技巧是把数组用i分开,然后讨论加上K和减去K的情况。这道题目的分享到这里,谢谢您的支持!