目录结构
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);
}
}
- 时间复杂度:
- 空间复杂度: