Number of Distinct Averages Problem & Solution

You are given a 0-indexed integer array nums of even length.

As long as nums is not empty, you must repetitively:

  • Find the minimum number in nums and remove it.
  • Find the maximum number in nums and remove it.
  • Calculate the average of the two removed numbers.

The average of two numbers a and b is (a + b) / 2.

For example, the average of 2 and 3 is (2 + 3) / 2 = 2.5. Return the number of distinct averages calculated using the above process.

Note that when there is a tie for a minimum or maximum number, any can be removed.

See the number of distinct averages problem on LeetCode.

C++ Solution

#pragma GCC optimize("Ofast")
#pragma GCC optimization("unroll-loops")

static const int _=[](){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);return 0;}();

class Solution {
public:
  int distinctAverages(vector<int>& nums) {
    sort(nums.begin(), nums.end()); // nlogn
    set<float> unique; // logn
    int i = 0, j = nums.size() - 1;
    while (i < j) {
      unique.insert((nums[i] + nums[j]) / 2.0);
      ++i;
      --j;
    }

    return unique.size();
  }
};