农民代表
- 积分
- 5663
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2012-8-15
- 最后登录
- 1970-1-1
|
本帖最后由 麻倉枼 于 2020-6-12 19:10 编辑
不知道有没有遗漏,不过花了我几个小时去解,太虐了
/*
NOTE:
- N is an integer within the range [0, 100,000] inclusive
- Each element of arrays X, Y is an integer within the range
[1, 1,000,000,000]
*/
class Solution
{
public:
int getNumberOfPairs(vector<int>& numerators,
vector<int>& denominators)
{
if (numerators.empty() ||
denominators.empty())
{
return 0;
}
if (numerators.size() != denominators.size())
{
return 0;
}
/*
Key = denominator
Value = a map of pair<numerator, frequency>
*/
unordered_map<int, unordered_map<int,int>> frequency_map;
const int SIZE = numerators.size();
/*
Create the frequency map,
each pair of numerator and denominator has been simplified.
*/
for (int i = 0; i < SIZE; ++i)
{
int denominator = denominators;
int numerator = numerators[i];
update_denominator_numerator(denominator, numerator);
++frequency_map[denominator][numerator];
}
int numWays = 0;[/i][i]
// Denominator
// pair<denominator, numerator map>
for (pair<int, unordered_map<int,int>> denominator_entry : frequency_map)
{
int denominator = denominator_entry.first;
// Numerator
// pair<numerator, frequency>
unordered_map<int, int>::iterator iter = frequency_map[denominator].begin();
while (!frequency_map[denominator].empty() &&
iter != frequency_map[denominator].end())
{
// (denominator - numerator)
int cur_numerator = iter->first;
int diff_numerator = (denominator - cur_numerator);
/*
NOTE:
If the diff is found in the numerator map,
that means we can find the pair that sum up to 1.
*/
if (frequency_map[denominator].count(diff_numerator))
{
int cur_frequency = iter->second;
/*
Special Case:
1/2 + 1/2 = 1.
*/
if (cur_numerator == diff_numerator)
{
int final_frequency = 0;
int count = (cur_frequency -1);
while (count > 0)
{
final_frequency += count;
--count;
}
// Update result.
numWays += final_frequency;
frequency_map[denominator].erase(cur_numerator);
continue;
}
int diff_frequency = frequency_map[denominator][diff_numerator];
// Update both frequencies.
int final_frequency = (cur_frequency * diff_frequency);
frequency_map[denominator].erase(cur_numerator);
frequency_map[denominator].erase(diff_numerator);
// Update result.
numWays += final_frequency;
}
else
{
++iter;
}
}
}
return numWays;
}
private:
void update_denominator_numerator(int& denominator, int& numerator)
{
int gcd = get_greatest_common_divisor(denominator, numerator);
denominator /= gcd;
numerator /= gcd;
}
/*
Reference:
- https://www.geeksforgeeks.org/c-program-find-gcd-hcf-two-numbers/
*/
int get_greatest_common_divisor(int denominator, int numerator)
{
if (denominator == 0)
{
return numerator;
}
if (numerator == 0)
{
return denominator;
}
// Base Case
if (denominator == numerator)
{
return denominator;
}
if (denominator > numerator)
{
return get_greatest_common_divisor((denominator - numerator), numerator);
}
return get_greatest_common_divisor(denominator, (numerator - denominator));
}
};[/i]
|
|