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类型,会导致结果出错。