LeetCode 5478. 最大得分(第200场周赛第4题)

目录结构

1.题目

2.题解


1.题目

你有两个 有序 且数组内元素互不相同的数组 nums1 和 nums2 。

一条 合法路径 定义如下:

  • 选择数组 nums1 或者 nums2 开始遍历(从下标 0 处开始)。
  • 从左到右遍历当前数组。
  • 如果你遇到了 nums1 和 nums2 中都存在的值,那么你可以切换路径到另一个数组对应数字处继续遍历(但在合法路径中重复数字只会被统计一次)。

得分定义为合法路径中不同数字的和。

请你返回所有可能合法路径中的最大得分。

由于答案可能很大,请你将它对 10^9 + 7 取余后返回。

示例:

输入:nums1 = [2,4,5,8,10], nums2 = [4,6,8,9]
输出:30
解释:合法路径包括:
[2,4,5,8,10], [2,4,5,8,9], [2,4,6,8,9], [2,4,6,8,10],(从 nums1 开始遍历)
[4,6,8,9], [4,5,8,10], [4,5,8,9], [4,6,8,10]  (从 nums2 开始遍历)
最大得分为上图中的绿色路径 [2,4,6,8,10] 。


输入:nums1 = [1,3,5,7,9], nums2 = [3,5,100]
输出:109
解释:最大得分由路径 [1,3,5,100] 得到。


输入:nums1 = [1,2,3,4,5], nums2 = [6,7,8,9,10]
输出:40
解释:nums1 和 nums2 之间无相同数字。
最大得分由路径 [6,7,8,9,10] 得到。


输入:nums1 = [1,4,5,8,9,11,19], nums2 = [2,3,4,11,12]
输出:61

提示:

  • 1 <= nums1.length <= 10^5
  • 1 <= nums2.length <= 10^5
  • 1 <= nums1[i], nums2[i] <= 10^7
  • nums1 和 nums2 都是严格递增的数组。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/get-the-maximum-score
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.题解

  • 对两个数组分别计算其以重复数字为界的分段的和,取较大值加入结果中;
  • 注意溢出问题和取余返回最终结果。
public class Solution5478 {

    @Test
    public void test5478() {
        int[] nums1 = {1, 2, 3, 6, 7}, nums2 = {5, 6, 8, 9, 10};
        System.out.println(maxSum(nums1, nums2));
    }

    public int maxSum(int[] nums1, int[] nums2) {
        int m = 1000000007, i = 0, j = 0;
        long count1 = 0, count2 = 0, result = 0;
        while (i < nums1.length || j < nums2.length) {
            if (i < nums1.length && j < nums2.length){
                if (nums1[i] < nums2[j]) {
                    count1 += nums1[i++];
                } else if (nums1[i] > nums2[j]) {
                    count2 += nums2[j++];
                } else {
                    count1 = count2 = Math.max(count1, count2) + nums1[i];
                    i++;j++;
                }
            }else if (i < nums1.length){
                count1 += nums1[i++];
            }else if (j < nums2.length){
                count2 += nums2[j++];
            }
        }
        return (int) (Math.max(count1, count2) % m);
    }
}
  • 时间复杂度:O(m+n)
  • 空间复杂度:O(1)

猜你喜欢

转载自blog.csdn.net/HarvestWu/article/details/107743880
今日推荐