Skip to content

Commit f6803e3

Browse files
committed
feat: add solutions to lc/lcof2 problems
lcof2 No.092 & lc No.0926.Flip String to Monotone Increasing
1 parent 79be796 commit f6803e3

File tree

11 files changed

+411
-3
lines changed

11 files changed

+411
-3
lines changed

lcof2/剑指 Offer II 092. 翻转字符/README.md

+87-1
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,108 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56+
我们需要找到一个分界点 `i`,使 `[:i]` 全为 0,`[i:]` 全为 1,并且翻转次数最少,问题就转换成计算 `i` 的左右两侧的翻转次数,可以用前缀和进行优化
57+
5658
<!-- tabs:start -->
5759

5860
### **Python3**
5961

6062
<!-- 这里可写当前语言的特殊实现逻辑 -->
6163

6264
```python
63-
65+
class Solution:
66+
def minFlipsMonoIncr(self, s: str) -> int:
67+
n = len(s)
68+
left, right = [0] * (n + 1), [0] * (n + 1)
69+
ans = 0x3f3f3f3f
70+
for i in range(1, n + 1):
71+
left[i] = left[i - 1] + (1 if s[i - 1] == '1' else 0)
72+
for i in range(n - 1, -1, -1):
73+
right[i] = right[i + 1] + (1 if s[i] == '0' else 0)
74+
for i in range(0, n + 1):
75+
ans = min(ans, left[i] + right[i])
76+
return ans
6477
```
6578

6679
### **Java**
6780

6881
<!-- 这里可写当前语言的特殊实现逻辑 -->
6982

7083
```java
84+
class Solution {
85+
public int minFlipsMonoIncr(String s) {
86+
int n = s.length();
87+
int[] left = new int[n + 1];
88+
int[] right = new int[n + 1];
89+
int ans = Integer.MAX_VALUE;
90+
for (int i = 1; i <= n; i++) {
91+
left[i] = left[i - 1] + (s.charAt(i - 1) == '1' ? 1 : 0);
92+
}
93+
for (int i = n - 1; i >= 0; i--) {
94+
right[i] = right[i + 1] + (s.charAt(i) == '0' ? 1 : 0);
95+
}
96+
for (int i = 0; i <= n; i++) {
97+
ans = Math.min(ans, left[i] + right[i]);
98+
}
99+
return ans;
100+
}
101+
}
102+
```
103+
104+
### **C++**
105+
106+
```cpp
107+
class Solution {
108+
public:
109+
int minFlipsMonoIncr(string s) {
110+
int n = s.size();
111+
vector<int> left(n + 1, 0), right(n + 1, 0);
112+
int ans = INT_MAX;
113+
for (int i = 1; i <= n; ++i) {
114+
left[i] = left[i - 1] + (s[i - 1] == '1');
115+
}
116+
for (int i = n - 1; i >= 0; --i) {
117+
right[i] = right[i + 1] + (s[i] == '0');
118+
}
119+
for (int i = 0; i <= n; i++) {
120+
ans = min(ans, left[i] + right[i]);
121+
}
122+
return ans;
123+
}
124+
};
125+
```
71126
127+
### **Go**
128+
129+
```go
130+
func minFlipsMonoIncr(s string) int {
131+
n := len(s)
132+
left, right := make([]int, n+1), make([]int, n+1)
133+
ans := math.MaxInt32
134+
for i := 1; i <= n; i++ {
135+
left[i] = left[i-1]
136+
if s[i-1] == '1' {
137+
left[i]++
138+
}
139+
}
140+
for i := n - 1; i >= 0; i-- {
141+
right[i] = right[i+1]
142+
if s[i] == '0' {
143+
right[i]++
144+
}
145+
}
146+
for i := 0; i <= n; i++ {
147+
ans = min(ans, left[i]+right[i])
148+
}
149+
return ans
150+
}
151+
152+
func min(x, y int) int {
153+
if x < y {
154+
return x
155+
}
156+
return y
157+
}
72158
```
73159

74160
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public:
3+
int minFlipsMonoIncr(string s) {
4+
int n = s.size();
5+
vector<int> left(n + 1, 0), right(n + 1, 0);
6+
int ans = INT_MAX;
7+
for (int i = 1; i <= n; ++i) {
8+
left[i] = left[i - 1] + (s[i - 1] == '1');
9+
}
10+
for (int i = n - 1; i >= 0; --i) {
11+
right[i] = right[i + 1] + (s[i] == '0');
12+
}
13+
for (int i = 0; i <= n; i++) {
14+
ans = min(ans, left[i] + right[i]);
15+
}
16+
return ans;
17+
}
18+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
func minFlipsMonoIncr(s string) int {
2+
n := len(s)
3+
left, right := make([]int, n+1), make([]int, n+1)
4+
ans := math.MaxInt32
5+
for i := 1; i <= n; i++ {
6+
left[i] = left[i-1]
7+
if s[i-1] == '1' {
8+
left[i]++
9+
}
10+
}
11+
for i := n - 1; i >= 0; i-- {
12+
right[i] = right[i+1]
13+
if s[i] == '0' {
14+
right[i]++
15+
}
16+
}
17+
for i := 0; i <= n; i++ {
18+
ans = min(ans, left[i]+right[i])
19+
}
20+
return ans
21+
}
22+
23+
func min(x, y int) int {
24+
if x < y {
25+
return x
26+
}
27+
return y
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public int minFlipsMonoIncr(String s) {
3+
int n = s.length();
4+
int[] left = new int[n + 1];
5+
int[] right = new int[n + 1];
6+
int ans = Integer.MAX_VALUE;
7+
for (int i = 1; i <= n; i++) {
8+
left[i] = left[i - 1] + (s.charAt(i - 1) == '1' ? 1 : 0);
9+
}
10+
for (int i = n - 1; i >= 0; i--) {
11+
right[i] = right[i + 1] + (s.charAt(i) == '0' ? 1 : 0);
12+
}
13+
for (int i = 0; i <= n; i++) {
14+
ans = Math.min(ans, left[i] + right[i]);
15+
}
16+
return ans;
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def minFlipsMonoIncr(self, s: str) -> int:
3+
n = len(s)
4+
left, right = [0] * (n + 1), [0] * (n + 1)
5+
ans = 0x3f3f3f3f
6+
for i in range(1, n + 1):
7+
left[i] = left[i - 1] + (1 if s[i - 1] == '1' else 0)
8+
for i in range(n - 1, -1, -1):
9+
right[i] = right[i + 1] + (1 if s[i] == '0' else 0)
10+
for i in range(0, n + 1):
11+
ans = min(ans, left[i] + right[i])
12+
return ans

solution/0900-0999/0926.Flip String to Monotone Increasing/README.md

+87-1
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,108 @@
4848

4949
<!-- 这里可写通用的实现逻辑 -->
5050

51+
我们需要找到一个分界点 `i`,使 `[:i]` 全为 0,`[i:]` 全为 1,并且翻转次数最少,问题就转换成计算 `i` 的左右两侧的翻转次数,可以用前缀和进行优化
52+
5153
<!-- tabs:start -->
5254

5355
### **Python3**
5456

5557
<!-- 这里可写当前语言的特殊实现逻辑 -->
5658

5759
```python
58-
60+
class Solution:
61+
def minFlipsMonoIncr(self, s: str) -> int:
62+
n = len(s)
63+
left, right = [0] * (n + 1), [0] * (n + 1)
64+
ans = 0x3f3f3f3f
65+
for i in range(1, n + 1):
66+
left[i] = left[i - 1] + (1 if s[i - 1] == '1' else 0)
67+
for i in range(n - 1, -1, -1):
68+
right[i] = right[i + 1] + (1 if s[i] == '0' else 0)
69+
for i in range(0, n + 1):
70+
ans = min(ans, left[i] + right[i])
71+
return ans
5972
```
6073

6174
### **Java**
6275

6376
<!-- 这里可写当前语言的特殊实现逻辑 -->
6477

6578
```java
79+
class Solution {
80+
public int minFlipsMonoIncr(String s) {
81+
int n = s.length();
82+
int[] left = new int[n + 1];
83+
int[] right = new int[n + 1];
84+
int ans = Integer.MAX_VALUE;
85+
for (int i = 1; i <= n; i++) {
86+
left[i] = left[i - 1] + (s.charAt(i - 1) == '1' ? 1 : 0);
87+
}
88+
for (int i = n - 1; i >= 0; i--) {
89+
right[i] = right[i + 1] + (s.charAt(i) == '0' ? 1 : 0);
90+
}
91+
for (int i = 0; i <= n; i++) {
92+
ans = Math.min(ans, left[i] + right[i]);
93+
}
94+
return ans;
95+
}
96+
}
97+
```
98+
99+
### **C++**
100+
101+
```cpp
102+
class Solution {
103+
public:
104+
int minFlipsMonoIncr(string s) {
105+
int n = s.size();
106+
vector<int> left(n + 1, 0), right(n + 1, 0);
107+
int ans = INT_MAX;
108+
for (int i = 1; i <= n; ++i) {
109+
left[i] = left[i - 1] + (s[i - 1] == '1');
110+
}
111+
for (int i = n - 1; i >= 0; --i) {
112+
right[i] = right[i + 1] + (s[i] == '0');
113+
}
114+
for (int i = 0; i <= n; i++) {
115+
ans = min(ans, left[i] + right[i]);
116+
}
117+
return ans;
118+
}
119+
};
120+
```
66121
122+
### **Go**
123+
124+
```go
125+
func minFlipsMonoIncr(s string) int {
126+
n := len(s)
127+
left, right := make([]int, n+1), make([]int, n+1)
128+
ans := math.MaxInt32
129+
for i := 1; i <= n; i++ {
130+
left[i] = left[i-1]
131+
if s[i-1] == '1' {
132+
left[i]++
133+
}
134+
}
135+
for i := n - 1; i >= 0; i-- {
136+
right[i] = right[i+1]
137+
if s[i] == '0' {
138+
right[i]++
139+
}
140+
}
141+
for i := 0; i <= n; i++ {
142+
ans = min(ans, left[i]+right[i])
143+
}
144+
return ans
145+
}
146+
147+
func min(x, y int) int {
148+
if x < y {
149+
return x
150+
}
151+
return y
152+
}
67153
```
68154

69155
### **...**

solution/0900-0999/0926.Flip String to Monotone Increasing/README_EN.md

+85-1
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,97 @@
7676
### **Python3**
7777

7878
```python
79-
79+
class Solution:
80+
def minFlipsMonoIncr(self, s: str) -> int:
81+
n = len(s)
82+
left, right = [0] * (n + 1), [0] * (n + 1)
83+
ans = 0x3f3f3f3f
84+
for i in range(1, n + 1):
85+
left[i] = left[i - 1] + (1 if s[i - 1] == '1' else 0)
86+
for i in range(n - 1, -1, -1):
87+
right[i] = right[i + 1] + (1 if s[i] == '0' else 0)
88+
for i in range(0, n + 1):
89+
ans = min(ans, left[i] + right[i])
90+
return ans
8091
```
8192

8293
### **Java**
8394

8495
```java
96+
class Solution {
97+
public int minFlipsMonoIncr(String s) {
98+
int n = s.length();
99+
int[] left = new int[n + 1];
100+
int[] right = new int[n + 1];
101+
int ans = Integer.MAX_VALUE;
102+
for (int i = 1; i <= n; i++) {
103+
left[i] = left[i - 1] + (s.charAt(i - 1) == '1' ? 1 : 0);
104+
}
105+
for (int i = n - 1; i >= 0; i--) {
106+
right[i] = right[i + 1] + (s.charAt(i) == '0' ? 1 : 0);
107+
}
108+
for (int i = 0; i <= n; i++) {
109+
ans = Math.min(ans, left[i] + right[i]);
110+
}
111+
return ans;
112+
}
113+
}
114+
```
115+
116+
### **C++**
117+
118+
```cpp
119+
class Solution {
120+
public:
121+
int minFlipsMonoIncr(string s) {
122+
int n = s.size();
123+
vector<int> left(n + 1, 0), right(n + 1, 0);
124+
int ans = INT_MAX;
125+
for (int i = 1; i <= n; ++i) {
126+
left[i] = left[i - 1] + (s[i - 1] == '1');
127+
}
128+
for (int i = n - 1; i >= 0; --i) {
129+
right[i] = right[i + 1] + (s[i] == '0');
130+
}
131+
for (int i = 0; i <= n; i++) {
132+
ans = min(ans, left[i] + right[i]);
133+
}
134+
return ans;
135+
}
136+
};
137+
```
85138
139+
### **Go**
140+
141+
```go
142+
func minFlipsMonoIncr(s string) int {
143+
n := len(s)
144+
left, right := make([]int, n+1), make([]int, n+1)
145+
ans := math.MaxInt32
146+
for i := 1; i <= n; i++ {
147+
left[i] = left[i-1]
148+
if s[i-1] == '1' {
149+
left[i]++
150+
}
151+
}
152+
for i := n - 1; i >= 0; i-- {
153+
right[i] = right[i+1]
154+
if s[i] == '0' {
155+
right[i]++
156+
}
157+
}
158+
for i := 0; i <= n; i++ {
159+
ans = min(ans, left[i]+right[i])
160+
}
161+
return ans
162+
}
163+
164+
func min(x, y int) int {
165+
if x < y {
166+
return x
167+
}
168+
return y
169+
}
86170
```
87171

88172
### **...**

0 commit comments

Comments
 (0)