<p>A sequence of numbers is called an <strong>arithmetic progression</strong> if the difference between any two consecutive elements is the same.</p>

<p>Given an array of numbers <code>arr</code>, return <code>true</code> <em>if the array can be rearranged to form an <strong>arithmetic progression</strong>. Otherwise, return</em> <code>false</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> arr = [3,5,1]
<strong>Output:</strong> true
<strong>Explanation: </strong>We can reorder the elements as [1,3,5] or [5,3,1] with differences 2 and -2 respectively, between each consecutive elements.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> arr = [1,2,4]
<strong>Output:</strong> false
<strong>Explanation: </strong>There is no way to reorder the elements to obtain an arithmetic progression.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>2 &lt;= arr.length &lt;= 1000</code></li>
	<li><code>-10<sup>6</sup> &lt;= arr[i] &lt;= 10<sup>6</sup></code></li>
</ul>

#include <limits>

class Solution {
public:
    bool canMakeArithmeticProgression(vector<int>& arr) {
        int max_v = std::numeric_limits<int>::min();
        int min_v = std::numeric_limits<int>::max();

        for (auto val:arr) {
            if (val>max_v) {
                max_v=val;
            } 
            if(val<min_v) {
                min_v=val;
            }
        }

        int gap=(max_v-min_v)/(arr.size()-1);

        if (gap*(arr.size()-1) != max_v-min_v) {
            return false;
        }

        //std::cout << max_v << ' ' <<  min_v  << ' '<< gap << std::endl;

        if (!gap) {
            return true;
        }

        vector<int> cnt(arr.size());

        for (auto val:arr) {
            auto diff=val-min_v;
            if (diff%gap) {
                return false;
            }

            if(++cnt[diff/gap]>1) {
                return false;
            }
        }

        for (auto val:cnt) {
            if (!val) {
                return false;
            }
        }

        return true;
    }
};
12000