Leetcode::Minimum Difference Between Largest and Smallest Value in Three Moves

point

Design

Big O(time)

Code

// 38mins
class Solution {
public:

    int minDifference(vector<int>& nums) {
        // 0. size <= 4
        if (nums.size() <= 4) return 0;

        // 1. find smallest four elements and largest four elements
        // _small[0] <= _small[1] <= _small[2] <= _small[3] // _large[0] <= _large[1] <= _large[2] <= _large[3]
        int _small[4] = {1000000000 + 1, 1000000000 + 1, 1000000000 + 1, 1000000000 + 1}, _large[4] = {-1000000000 - 1, -1000000000 - 1, -1000000000 - 1, -1000000000 - 1};

        // 2. sort
        for(auto x : nums) {
            {
                if (x <= _small[3]) {
                    if (x <= _small[2]) {
                        if (x <= _small[1]) {
                            if (x <= _small[0]) {
                                swap(_small[2], _small[3]);
                                swap(_small[1], _small[2]);
                                swap(_small[0], _small[1]);
                                _small[0] = x;
                            } else {
                                swap(_small[2], _small[3]);
                                swap(_small[1], _small[2]);
                                _small[1] = x;
                            }
                        }else {
                            swap(_small[2], _small[3]);
                            _small[2] = x;
                        }
                    }else {
                        _small[3] = x;
                    }
                }
            }

            {
                if (x >= _large[0]) {
                    if (x >= _large[1]) {
                        if (x >= _large[2]) {
                            if (x >= _large[3]) {
                                swap(_large[0], _large[1]);
                                swap(_large[1], _large[2]);
                                swap(_large[2], _large[3]);
                                _large[3] = x;
                            } else {
                                swap(_large[0], _large[1]);
                                swap(_large[1], _large[2]);
                                _large[2] = x;
                            }
                        }else {
                            swap(_large[0], _large[1]);
                            _large[1] = x;
                        }
                    }else {
                        _large[0] = x;
                    }
                }
            }
        }

        // 4. finding smallest gap among 4 combintations
        int ret = (_large[3] - _small[0]);

        // choose 0 from the start, choose 3 from the back
        ret = min(ret, _large[0] - _small[0]);

        // choose 1 from the start, choose 2 from the back
        ret = min(ret, _large[1] - _small[1]);

        // choose 2 from the start, choose 1 from the back
        ret = min(ret, _large[2] - _small[2]);

        // choose 3 from the start, choose 0 from the back
        ret = min(ret, _large[3] - _small[3]);

        return ret;
    }
};
// 0 1 5 10 14