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]
Note:
1 <= A.length <= 10000
0 <= A[i] <= 10000
0 <= K <= 10000
class Solution {
public int smallestRangeI(int[] A, int K) {
Arrays.sort(A);
int dis = 0;
dis= A[A.length-1]- A[0];
if(dis<2*K||dis == 2*K) return 0;
else return (dis - 2*K);
}
}
这道题很简单,但是很容易写成上述代码的形式。时间复杂度最坏O(n^2),最好O(nlogn)。
找最大值和最小值,O(n)时间足够了。题目虽然容易,但是菜鸟和大神之间的差距就是从这么简单的题目开始的。
class Solution {
public int smallestRangeI(int[] A, int K) {
int min = A[0];
int max = A[0];
for(int a : A){
if(min > a) min = a;
if(max < a) max = a;
}
if(max - min <2*K || max - min == 2*K) return 0;
else return (max-min-2*K);
}
}
时间复杂度为O(n),Runtime: 5 ms, faster than 96.45% of Java online submissions for Smallest Range I.