Skip to content

Commit 7984256

Browse files
committed
feat: add solutions to lc problem: No.1262
No.1262.Greatest Sum Divisible by Three
1 parent df4dd69 commit 7984256

File tree

6 files changed

+161
-43
lines changed

6 files changed

+161
-43
lines changed

solution/1200-1299/1262.Greatest Sum Divisible by Three/README.md

Lines changed: 62 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@
4646

4747
<!-- 这里可写通用的实现逻辑 -->
4848

49+
**方法一:动态规划**
50+
51+
我们定义 $f[j]$ 表示前 $i-1$ 个数中,余数为 $j$ 的最大和。那么对于当前的数 $x$,我们可以将其加入到前面的数中,得到的和为 $f[j] + x$,其中 $j$ 为 $(f[j] + x) \bmod 3$。
52+
53+
最后,我们返回 $f[0]$ 即可。
54+
55+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 `nums` 的长度。
56+
4957
<!-- tabs:start -->
5058

5159
### **Python3**
@@ -55,13 +63,13 @@
5563
```python
5664
class Solution:
5765
def maxSumDivThree(self, nums: List[int]) -> int:
58-
dp = [0] * 3
59-
for v in nums:
60-
a, b, c = dp[0] + v, dp[1] + v, dp[2] + v
61-
dp[a % 3] = max(dp[a % 3], a)
62-
dp[b % 3] = max(dp[b % 3], b)
63-
dp[c % 3] = max(dp[c % 3], c)
64-
return dp[0]
66+
f = [0] * 3
67+
for x in nums:
68+
a, b, c = f[0] + x, f[1] + x, f[2] + x
69+
f[a % 3] = max(f[a % 3], a)
70+
f[b % 3] = max(f[b % 3], b)
71+
f[c % 3] = max(f[c % 3], c)
72+
return f[0]
6573
```
6674

6775
### **Java**
@@ -71,18 +79,58 @@ class Solution:
7179
```java
7280
class Solution {
7381
public int maxSumDivThree(int[] nums) {
74-
int[] dp = new int[3];
75-
for (int v : nums) {
76-
int a = dp[0] + v, b = dp[1] + v, c = dp[2] + v;
77-
dp[a % 3] = Math.max(dp[a % 3], a);
78-
dp[b % 3] = Math.max(dp[b % 3], b);
79-
dp[c % 3] = Math.max(dp[c % 3], c);
82+
int[] f = new int[3];
83+
for (int x : nums) {
84+
int a = f[0] + x, b = f[1] + x, c = f[2] + x;
85+
f[a % 3] = Math.max(f[a % 3], a);
86+
f[b % 3] = Math.max(f[b % 3], b);
87+
f[c % 3] = Math.max(f[c % 3], c);
8088
}
81-
return dp[0];
89+
return f[0];
8290
}
8391
}
8492
```
8593

94+
### **C++**
95+
96+
```cpp
97+
class Solution {
98+
public:
99+
int maxSumDivThree(vector<int>& nums) {
100+
int f[3]{};
101+
for (int x : nums) {
102+
int a = f[0] + x, b = f[1] + x, c = f[2] + x;
103+
f[a % 3] = max(f[a % 3], a);
104+
f[b % 3] = max(f[b % 3], b);
105+
f[c % 3] = max(f[c % 3], c);
106+
}
107+
return f[0];
108+
}
109+
};
110+
```
111+
112+
### **Go**
113+
114+
```go
115+
func maxSumDivThree(nums []int) int {
116+
f := [3]int{}
117+
for _, x := range nums {
118+
a, b, c := f[0]+x, f[1]+x, f[2]+x
119+
f[a%3] = max(f[a%3], a)
120+
f[b%3] = max(f[b%3], b)
121+
f[c%3] = max(f[c%3], c)
122+
}
123+
return f[0]
124+
}
125+
126+
func max(a, b int) int {
127+
if a > b {
128+
return a
129+
}
130+
return b
131+
}
132+
```
133+
86134
### **...**
87135

88136
```

solution/1200-1299/1262.Greatest Sum Divisible by Three/README_EN.md

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,32 +47,72 @@
4747
```python
4848
class Solution:
4949
def maxSumDivThree(self, nums: List[int]) -> int:
50-
dp = [0] * 3
51-
for v in nums:
52-
a, b, c = dp[0] + v, dp[1] + v, dp[2] + v
53-
dp[a % 3] = max(dp[a % 3], a)
54-
dp[b % 3] = max(dp[b % 3], b)
55-
dp[c % 3] = max(dp[c % 3], c)
56-
return dp[0]
50+
f = [0] * 3
51+
for x in nums:
52+
a, b, c = f[0] + x, f[1] + x, f[2] + x
53+
f[a % 3] = max(f[a % 3], a)
54+
f[b % 3] = max(f[b % 3], b)
55+
f[c % 3] = max(f[c % 3], c)
56+
return f[0]
5757
```
5858

5959
### **Java**
6060

6161
```java
6262
class Solution {
6363
public int maxSumDivThree(int[] nums) {
64-
int[] dp = new int[3];
65-
for (int v : nums) {
66-
int a = dp[0] + v, b = dp[1] + v, c = dp[2] + v;
67-
dp[a % 3] = Math.max(dp[a % 3], a);
68-
dp[b % 3] = Math.max(dp[b % 3], b);
69-
dp[c % 3] = Math.max(dp[c % 3], c);
64+
int[] f = new int[3];
65+
for (int x : nums) {
66+
int a = f[0] + x, b = f[1] + x, c = f[2] + x;
67+
f[a % 3] = Math.max(f[a % 3], a);
68+
f[b % 3] = Math.max(f[b % 3], b);
69+
f[c % 3] = Math.max(f[c % 3], c);
7070
}
71-
return dp[0];
71+
return f[0];
7272
}
7373
}
7474
```
7575

76+
### **C++**
77+
78+
```cpp
79+
class Solution {
80+
public:
81+
int maxSumDivThree(vector<int>& nums) {
82+
int f[3]{};
83+
for (int x : nums) {
84+
int a = f[0] + x, b = f[1] + x, c = f[2] + x;
85+
f[a % 3] = max(f[a % 3], a);
86+
f[b % 3] = max(f[b % 3], b);
87+
f[c % 3] = max(f[c % 3], c);
88+
}
89+
return f[0];
90+
}
91+
};
92+
```
93+
94+
### **Go**
95+
96+
```go
97+
func maxSumDivThree(nums []int) int {
98+
f := [3]int{}
99+
for _, x := range nums {
100+
a, b, c := f[0]+x, f[1]+x, f[2]+x
101+
f[a%3] = max(f[a%3], a)
102+
f[b%3] = max(f[b%3], b)
103+
f[c%3] = max(f[c%3], c)
104+
}
105+
return f[0]
106+
}
107+
108+
func max(a, b int) int {
109+
if a > b {
110+
return a
111+
}
112+
return b
113+
}
114+
```
115+
76116
### **...**
77117

78118
```
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution {
2+
public:
3+
int maxSumDivThree(vector<int>& nums) {
4+
int f[3]{};
5+
for (int x : nums) {
6+
int a = f[0] + x, b = f[1] + x, c = f[2] + x;
7+
f[a % 3] = max(f[a % 3], a);
8+
f[b % 3] = max(f[b % 3], b);
9+
f[c % 3] = max(f[c % 3], c);
10+
}
11+
return f[0];
12+
}
13+
};
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
func maxSumDivThree(nums []int) int {
2+
f := [3]int{}
3+
for _, x := range nums {
4+
a, b, c := f[0]+x, f[1]+x, f[2]+x
5+
f[a%3] = max(f[a%3], a)
6+
f[b%3] = max(f[b%3], b)
7+
f[c%3] = max(f[c%3], c)
8+
}
9+
return f[0]
10+
}
11+
12+
func max(a, b int) int {
13+
if a > b {
14+
return a
15+
}
16+
return b
17+
}
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
class Solution {
22
public int maxSumDivThree(int[] nums) {
3-
int[] dp = new int[3];
4-
for (int v : nums) {
5-
int a = dp[0] + v, b = dp[1] + v, c = dp[2] + v;
6-
dp[a % 3] = Math.max(dp[a % 3], a);
7-
dp[b % 3] = Math.max(dp[b % 3], b);
8-
dp[c % 3] = Math.max(dp[c % 3], c);
3+
int[] f = new int[3];
4+
for (int x : nums) {
5+
int a = f[0] + x, b = f[1] + x, c = f[2] + x;
6+
f[a % 3] = Math.max(f[a % 3], a);
7+
f[b % 3] = Math.max(f[b % 3], b);
8+
f[c % 3] = Math.max(f[c % 3], c);
99
}
10-
return dp[0];
10+
return f[0];
1111
}
12-
}
12+
}
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
class Solution:
22
def maxSumDivThree(self, nums: List[int]) -> int:
3-
dp = [0] * 3
4-
for v in nums:
5-
a, b, c = dp[0] + v, dp[1] + v, dp[2] + v
6-
dp[a % 3] = max(dp[a % 3], a)
7-
dp[b % 3] = max(dp[b % 3], b)
8-
dp[c % 3] = max(dp[c % 3], c)
9-
return dp[0]
3+
f = [0] * 3
4+
for x in nums:
5+
a, b, c = f[0] + x, f[1] + x, f[2] + x
6+
f[a % 3] = max(f[a % 3], a)
7+
f[b % 3] = max(f[b % 3], b)
8+
f[c % 3] = max(f[c % 3], c)
9+
return f[0]

0 commit comments

Comments
 (0)