LeetCode 1537. 最大得分(貪心)
阿新 • • 發佈:2020-12-12
題意:
你有兩個 有序 且陣列內元素互不相同的陣列 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;
}
};