Hard
Minimum Total Cost to Make Arrays Unequal — C++
Full explanation · Time O(n) · Space O(n)
// Time: O(n)
// Space: O(n)
// greedy
class Solution {
public:
long long minimumTotalCost(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> cnt;
int64_t result = 0;
for (int i = 0; i < size(nums1); ++i) {
if (nums1[i] != nums2[i]) {
continue;
}
++cnt[nums1[i]];
result += i;
}
if (empty(cnt)) {
return 0;
}
const int majority = max_element(cbegin(cnt), cend(cnt),
[](const auto& a, const auto& b) {
return a.second < b.second;
})->first;
int remain = cnt[majority] - (accumulate(cbegin(cnt), cend(cnt), 0,
[](const auto& total, const auto& x) {
return total + x.second;
}) - cnt[majority]);
if (remain <= 0) {
return result;
}
for (int i = 0; i < size(nums1); ++i) {
if (nums1[i] == nums2[i] || nums1[i] == majority || nums2[i] == majority) {
continue;
}
result += i;
if (--remain == 0) {
return result;
}
}
return -1;
}
};