910. Smallest Range II

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:

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: 3
Explanation: B = [4,6,3]

 

Note:

  1. 1 <= A.length <= 10000
  2. 0 <= A[i] <= 10000
  3. 0 <= K <= 10000

Rust Solution

struct Solution;

impl Solution {
    fn smallest_range_ii(mut a: Vec<i32>, k: i32) -> i32 {
        let n = a.len();
        a.sort_unstable();
        let mut max = a[n - 1];
        let mut min = a[0];
        let mut res = max - min;
        for i in 0..n - 1 {
            max = max.max(a[i] + 2 * k);
            min = a[i + 1].min(a[0] + 2 * k);
            res = res.min(max - min);
        }
        res
    }
}

#[test]
fn test() {
    let a = vec![1];
    let k = 0;
    let res = 0;
    assert_eq!(Solution::smallest_range_ii(a, k), res);
    let a = vec![0, 10];
    let k = 2;
    let res = 6;
    assert_eq!(Solution::smallest_range_ii(a, k), res);
    let a = vec![1, 3, 6];
    let k = 3;
    let res = 3;
    assert_eq!(Solution::smallest_range_ii(a, k), res);
    let a = vec![2, 7, 2];
    let k = 1;
    let res = 3;
    assert_eq!(Solution::smallest_range_ii(a, k), res);
}

Having problems with this solution? Click here to submit an issue on github.