|
1 |
| -#define ll long long |
| 1 | +// Runtime: 84 ms (Top 60.79%) | Memory: 56.00 MB (Top 84.58%) |
| 2 | + |
2 | 3 | class Solution {
|
3 | 4 | public:
|
4 |
| - ll dp1[100005]; |
5 |
| - ll dp2[100005]; |
6 |
| - |
7 |
| - ll mod=1e9+7; |
8 |
| - |
9 |
| - ll func(vector<int> &nums1 , vector<int> &nums2 , unordered_map< int , int> &mp1, |
10 |
| - unordered_map< int , int> &mp2 , int i1 , int i2 , int n1 , int n2 , bool f1) |
11 |
| - { |
12 |
| - if(i1>=n1 || i2>=n2) |
13 |
| - { |
14 |
| - return 0; |
15 |
| - } |
16 |
| - |
17 |
| - ll sum1=0; |
18 |
| - |
19 |
| - ll sum2=0; |
20 |
| - |
21 |
| - ll ans=0; |
22 |
| - |
23 |
| - if(f1==true) |
24 |
| - { |
25 |
| - if(dp1[i1]!=-1) |
26 |
| - { |
27 |
| - return dp1[i1]; |
28 |
| - } |
29 |
| - } |
30 |
| - else |
31 |
| - { |
32 |
| - if(dp2[i2]!=-1) |
33 |
| - { |
34 |
| - return dp2[i2]; |
35 |
| - } |
36 |
| - } |
37 |
| - |
38 |
| - if(f1==true) |
39 |
| - { |
40 |
| - sum1=(sum1 + nums1[i1]); |
41 |
| - auto it=mp2.find(nums1[i1]); |
42 |
| - |
43 |
| - sum1=(sum1 + func(nums1 , nums2 , mp1 , mp2 , i1+1 , i2 , n1 , n2 , true)); |
44 |
| - |
45 |
| - if(it!=mp2.end()) |
46 |
| - { |
47 |
| - int idx=mp2[nums1[i1]]; |
48 |
| - sum2=(sum2 + nums2[idx]); |
49 |
| - |
50 |
| - sum2=(sum2 + func(nums1 , nums2 , mp1 , mp2 , i1 , idx+1 , n1 , n2 , false )); |
51 |
| - |
52 |
| - } |
53 |
| - ans=max(sum1 , sum2); |
54 |
| - |
55 |
| - dp1[i1]=ans; |
56 |
| - } |
57 |
| - else |
| 5 | + int maxSum(vector<int>& nums1, vector<int>& nums2) { |
| 6 | + int mod=1e9+7; |
| 7 | + long long int ans=0, sum1=0, sum2=0; |
| 8 | + int i=0, j=0; |
| 9 | + while(i<nums1.size() and j<nums2.size()) |
58 | 10 | {
|
59 |
| - sum2=(sum2 + nums2[i2]); |
60 |
| - auto it=mp1.find(nums2[i2]); |
61 |
| - |
62 |
| - sum2=(sum2 + func(nums1 , nums2 , mp1 , mp2 , i1 , i2+1 , n1 , n2 , false)); |
63 |
| - |
64 |
| - if(it!=mp1.end()) |
| 11 | + if(nums1[i] < nums2[j]) |
| 12 | + sum1 += nums1[i++]; |
| 13 | + else if(nums1[i] > nums2[j]) |
| 14 | + sum2 += nums2[j++]; |
| 15 | + else |
65 | 16 | {
|
66 |
| - int idx=mp1[nums2[i2]]; |
67 |
| - sum1= (sum1 + nums1[idx]); |
68 |
| - sum1=(sum1 + func(nums1 , nums2 , mp1 , mp2 , idx+1 , i2 , n1 , n2 , true)); |
| 17 | + ans += nums1[i] + max(sum1, sum2); |
| 18 | + i++; |
| 19 | + j++; |
| 20 | + sum1=0; |
| 21 | + sum2=0; |
69 | 22 | }
|
70 |
| - ans=max(sum1 , sum2); |
71 |
| - dp2[i2]=ans; |
72 |
| - } |
73 |
| - |
74 |
| - |
75 |
| - return ans; |
76 |
| - |
77 |
| - |
78 |
| - } |
79 |
| - |
80 |
| - int maxSum(vector<int>& nums1, vector<int>& nums2) { |
81 |
| - |
82 |
| - // at every equal value we can switch |
83 |
| - |
84 |
| - // the elements from array1 to array2 |
85 |
| - |
86 |
| - unordered_map< int , int> mp1 , mp2; |
87 |
| - |
88 |
| - int n1=nums1.size() , n2=nums2.size(); |
89 |
| - |
90 |
| - for(int i=0;i<nums1.size();i++) |
91 |
| - { |
92 |
| - mp1[nums1[i]]=i; |
93 |
| - } |
94 |
| - |
95 |
| - for(int i=0;i<nums2.size();i++) |
96 |
| - { |
97 |
| - mp2[nums2[i]]=i; |
98 | 23 | }
|
99 |
| - |
100 |
| - // start from both array as nums1 & nums2 , nums2 & nums1 |
101 |
| - |
102 |
| - memset(dp1 , -1 , sizeof(dp1)); |
103 |
| - memset(dp2 , -1 , sizeof(dp2)); |
104 |
| - |
105 |
| - bool f1=true; |
106 |
| - |
107 |
| - ll ans1=func(nums1 , nums2 , mp1 , mp2 , 0 , 0 ,n1 , n2 , f1); |
108 |
| - memset(dp1 , -1 , sizeof(dp1)); |
109 |
| - memset(dp2 , -1 , sizeof(dp2)); |
110 |
| - ll ans2=func(nums2 , nums1 , mp2 , mp1 , 0 , 0 , n2 , n1 , f1); |
111 |
| - |
112 |
| - ans1=ans1%mod; |
113 |
| - ans2=ans2%mod; |
114 |
| - |
115 |
| - return max(ans1 , ans2); |
116 |
| - |
| 24 | + while(i<nums1.size()) |
| 25 | + sum1 += nums1[i++]; |
| 26 | + while(j<nums2.size()) |
| 27 | + sum2 += nums2[j++]; |
| 28 | + ans += max(sum1, sum2); |
| 29 | + ans = ans%mod; |
| 30 | + return (int)ans; |
117 | 31 | }
|
| 32 | +}; |
0 commit comments