LeetCode 1537. 最大得分 原题链接:最大得分
1. 难点
在切换点如何进行选择才能获得最大值
2. 思路
选择切换点获得最大值,实际上是比较切换点到下一个切换点之间的元素总和的大小。所以只要先累加每一个切换点,再在每一次切换的时候比较两个数组切换点后面那段,总和大的那一段累加,最后就会获得最大值。
3. 代码注释
变量定义的解释
unordered_set<int> maps;
unordered_set<int> mult;
用两个set找出两个数组中重复的部分,存储在mult中
vector<vector<long long>> vec(2);
存储每个切换点之后那一段的总和 long long max = 0;
最大值,注意类型 long long sum = 0;
总和
int maxSum(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> maps;
unordered_set<int> mult; //重复的集合
vector<vector<long long>> vec(2); //两个切换点之间的总和
long long max = 0;
/*按顺序找出所有可切换的点,放入vec中*/
for (int i = 0; i < nums1.size(); i++)
maps.insert(nums1[i]);
for (int i = 0; i < nums2.size(); i++)
{
auto item = maps.find(nums2[i]);
if (item != maps.end())
{
mult.insert(nums2[i]);
max = (max + nums2[i]) % 1000000007; //所有切换点累加
}
}
/*累计两个切换点之间的总和*/
long long sum = 0;
for (auto i : nums1)
{
if (mult.find(i) == mult.end())
sum = (sum + i) ;
else
{
vec[0].push_back(sum);
sum = 0;
}
}
if (sum) //最后一段的总和
{
vec[0].push_back(sum);
sum = 0;
}
for (auto i : nums2)
{
if (mult.find(i) == mult.end())
sum = (sum + i) ;
else
{
vec[1].push_back(sum);
sum = 0;
}
}
if (sum)
{
vec[1].push_back(sum);
sum = 0;
}
/*全部累加*/
int count_max = 0;
for (int i = 0; i < vec.size(); i++)
{
if (vec[i].size() > count_max)
count_max = vec[i].size();
}
/*防止两个数组长度不相同*/
for (int i = 0; i < count_max - 1; i++)
{
max = (max + std::max(vec[0][i], vec[1][i])) % (1000000000 + 7);
}
/*分类累加最后一个元素*/
if (vec.begin()->size() > vec.rbegin()->size())
max = (max + *vec.begin()->rbegin()) % (1000000000 + 7);
else if (vec.begin()->size() < vec.rbegin()->size())
max = (max + *vec.rbegin()->rbegin()) % (1000000000 + 7);
else
max = (max + std::max(*vec.begin()->rbegin(), *vec.rbegin()->rbegin())) % (1000000000 + 7);
return max;
}
4. 总结反思
特别需要注意 对 10^9 + 7 取余后返回这个条件。如果sum,max,vec使用int类型,会导致结果出错。