1. 程式人生 > 其它 >LeetCode 1537. 最大得分(貪心)

LeetCode 1537. 最大得分(貪心)

題意:

你有兩個 有序 且陣列內元素互不相同的陣列 nums1 和 nums2 。

一條 合法路徑 定義如下:

選擇陣列 nums1 或者 nums2 開始遍歷(從下標 0 處開始)。
從左到右遍歷當前陣列。
如果你遇到了 nums1 和 nums2 中都存在的值,
那麼你可以切換路徑到另一個數組對應數字處繼續遍歷(但在合法路徑中重複數字只會被統計一次)。
得分定義為合法路徑中不同數字的和。

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

由於答案可能很大,請你將它對 10^9 + 7 取餘後返回。


資料範圍:
1 <= nums1.length <= 10^5
1 <= nums2.
length <= 10^5 1 <= nums1[i], nums2[i] <= 10^7 nums1 和 nums2 都是嚴格遞增的陣列。

圖例:
在這裡插入圖片描述

解法:

因為嚴格遞增,所以同一個陣列中每種數只會出現一次.
那麼題目可以變為:

在這裡插入圖片描述

那麼每段貪心一下就行了.

code:

const int mod=1e9+7;
#define PI pair<int,int>
#define ll long long
class Solution {
public:
    int maxSum(vector<int>& a, vector<int>
& b) { int n=a.size(),m=b.size(); vector<ll>s(n+5,0),ss(m+5,0); for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i-1]; for(int i=1;i<=m;i++)ss[i]=ss[i-1]+b[i-1]; vector<PI>temp; temp.push_back({0,0}); int cur=1; for(int i=1;i<=n;
i++){ while(cur<=m&&b[cur-1]<a[i-1]){ cur++; } if(cur>m)break; if(b[cur-1]==a[i-1]){ temp.push_back({i,cur}); } } a.push_back(0); b.push_back(0); s[n+1]=s[n]; ss[m+1]=ss[m]; temp.push_back({n+1,m+1}); int len=temp.size(); ll ans=0; for(int i=1;i<len;i++){ int x=temp[i].first,y=temp[i].second; int xx=temp[i-1].first,yy=temp[i-1].second; ll t=max(s[x]-s[xx],ss[y]-ss[yy]); ans=(ans+t)%mod; } return (int)ans; } };