题目链接:LeetCode 1537. 最大得分
题意:
你有两个 有序 且数组内元素互不相同的数组 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] 。
解题思路:
class Solution {
/**
* @param Integer[] $nums1
* @param Integer[] $nums2
* @return Integer
*/
function maxSum($nums1, $nums2) {
$n1 = 0; $n2 = 0; $k = 0;
$n = count($nums1); $m = count($nums2);
$i = 0; $j = 0;
while($i < $n || $j < $m) {
if($i < $n && $j < $m) {
if($nums1[$i] < $nums2[$j]) {
$n1 += $nums1[$i];
$i++;
}
else if($nums1[$i] > $nums2[$j]) {
$n2 += $nums2[$j];
$j++;
}
else {
$k = max($n1, $n2) + $nums1 [$i];
$n1 = $n2 = $k;
$i++; $j++;
}
}
else if($i < $n) {
$n1 += $nums1[$i]; $i++;
}
else if($j < $m) {
$n2 += $nums2[$j]; $j++;
}
}
return max($n1, $n2) % (1e9+7);
}
}