Skip to content

Commit 8acf35e

Browse files
committed
feat: add solutions to lc problem: No.1868
No.1868.Product of Two Run-Length Encoded Arrays
1 parent 168d8c1 commit 8acf35e

File tree

6 files changed

+313
-2
lines changed

6 files changed

+313
-2
lines changed

solution/1800-1899/1868.Product of Two Run-Length Encoded Arrays/README.md

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,135 @@ prodNums = [2,2,2,6,9,9],压缩成行程编码数组 [[2,3],[6,1],[9,2]]。
6161

6262
<!-- 这里可写通用的实现逻辑 -->
6363

64+
**方法一:双指针**
65+
66+
我们用两个指针 $i$ 和 $j$ 分别指向两个数组的当前位置,然后开始模拟乘法的过程。
67+
68+
对于当前位置 $i$ 和 $j$,我们取 $f=min(encoded1[i][1],encoded2[j][1])$,表示当前位置的乘积的频次,然后将 $v=encoded1[i][0] \times encoded2[j][0]$,表示当前位置的乘积的值。如果当前位置的乘积的值 $v$ 和上一个位置的乘积的值相同,则将当前位置的乘积的频次加到上一个位置的乘积的频次上,否则将当前位置的乘积的值和频次加到答案数组中。然后我们将 $encoded1[i][1]$ 和 $encoded2[j][1]$ 分别减去 $f$,如果 $encoded1[i][1]$ 或 $encoded2[j][1]$ 减为 $0$,则将对应的指针向后移动一位。
69+
70+
最后返回答案数组即可。
71+
72+
时间复杂度 $O(m + n)$,其中 $m$ 和 $n$ 分别是两个数组的长度。忽略答案数组的空间消耗,空间复杂度 $O(1)$。
73+
6474
<!-- tabs:start -->
6575

6676
### **Python3**
6777

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

7080
```python
71-
81+
class Solution:
82+
def findRLEArray(self, encoded1: List[List[int]], encoded2: List[List[int]]) -> List[List[int]]:
83+
ans = []
84+
j = 0
85+
for vi, fi in encoded1:
86+
while fi:
87+
f = min(fi, encoded2[j][1])
88+
v = vi * encoded2[j][0]
89+
if ans and ans[-1][0] == v:
90+
ans[-1][1] += f
91+
else:
92+
ans.append([v, f])
93+
fi -= f
94+
encoded2[j][1] -= f
95+
if encoded2[j][1] == 0:
96+
j += 1
97+
return ans
7298
```
7399

74100
### **Java**
75101

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

78104
```java
105+
class Solution {
106+
public List<List<Integer>> findRLEArray(int[][] encoded1, int[][] encoded2) {
107+
List<List<Integer>> ans = new ArrayList<>();
108+
int j = 0;
109+
for (var e : encoded1) {
110+
int vi = e[0], fi = e[1];
111+
while (fi > 0) {
112+
int f = Math.min(fi, encoded2[j][1]);
113+
int v = vi * encoded2[j][0];
114+
int m = ans.size();
115+
if (m > 0 && ans.get(m - 1).get(0) == v) {
116+
ans.get(m - 1).set(1, ans.get(m - 1).get(1) + f);
117+
} else {
118+
ans.add(new ArrayList<>(List.of(v, f)));
119+
}
120+
fi -= f;
121+
encoded2[j][1] -= f;
122+
if (encoded2[j][1] == 0) {
123+
++j;
124+
}
125+
}
126+
}
127+
return ans;
128+
}
129+
}
130+
```
131+
132+
### **C++**
133+
134+
```cpp
135+
class Solution {
136+
public:
137+
vector<vector<int>> findRLEArray(vector<vector<int>>& encoded1, vector<vector<int>>& encoded2) {
138+
vector<vector<int>> ans;
139+
int j = 0;
140+
for (auto& e : encoded1) {
141+
int vi = e[0], fi = e[1];
142+
while (fi) {
143+
int f = min(fi, encoded2[j][1]);
144+
int v = vi * encoded2[j][0];
145+
if (!ans.empty() && ans.back()[0] == v) {
146+
ans.back()[1] += f;
147+
} else {
148+
ans.push_back({v, f});
149+
}
150+
fi -= f;
151+
encoded2[j][1] -= f;
152+
if (encoded2[j][1] == 0) {
153+
++j;
154+
}
155+
}
156+
}
157+
return ans;
158+
}
159+
};
160+
```
79161
162+
### **Go**
163+
164+
```go
165+
func findRLEArray(encoded1 [][]int, encoded2 [][]int) (ans [][]int) {
166+
j := 0
167+
for _, e := range encoded1 {
168+
vi, fi := e[0], e[1]
169+
for fi > 0 {
170+
f := min(fi, encoded2[j][1])
171+
v := vi * encoded2[j][0]
172+
if len(ans) > 0 && ans[len(ans)-1][0] == v {
173+
ans[len(ans)-1][1] += f
174+
} else {
175+
ans = append(ans, []int{v, f})
176+
}
177+
fi -= f
178+
encoded2[j][1] -= f
179+
if encoded2[j][1] == 0 {
180+
j++
181+
}
182+
}
183+
}
184+
return
185+
}
186+
187+
func min(a, b int) int {
188+
if a < b {
189+
return a
190+
}
191+
return b
192+
}
80193
```
81194

82195
### **...**

solution/1800-1899/1868.Product of Two Run-Length Encoded Arrays/README_EN.md

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,116 @@ prodNums = [2,2,2,6,9,9], which is compressed into the run-length encoded array
6262
### **Python3**
6363

6464
```python
65-
65+
class Solution:
66+
def findRLEArray(self, encoded1: List[List[int]], encoded2: List[List[int]]) -> List[List[int]]:
67+
ans = []
68+
j = 0
69+
for vi, fi in encoded1:
70+
while fi:
71+
f = min(fi, encoded2[j][1])
72+
v = vi * encoded2[j][0]
73+
if ans and ans[-1][0] == v:
74+
ans[-1][1] += f
75+
else:
76+
ans.append([v, f])
77+
fi -= f
78+
encoded2[j][1] -= f
79+
if encoded2[j][1] == 0:
80+
j += 1
81+
return ans
6682
```
6783

6884
### **Java**
6985

7086
```java
87+
class Solution {
88+
public List<List<Integer>> findRLEArray(int[][] encoded1, int[][] encoded2) {
89+
List<List<Integer>> ans = new ArrayList<>();
90+
int j = 0;
91+
for (var e : encoded1) {
92+
int vi = e[0], fi = e[1];
93+
while (fi > 0) {
94+
int f = Math.min(fi, encoded2[j][1]);
95+
int v = vi * encoded2[j][0];
96+
int m = ans.size();
97+
if (m > 0 && ans.get(m - 1).get(0) == v) {
98+
ans.get(m - 1).set(1, ans.get(m - 1).get(1) + f);
99+
} else {
100+
ans.add(new ArrayList<>(List.of(v, f)));
101+
}
102+
fi -= f;
103+
encoded2[j][1] -= f;
104+
if (encoded2[j][1] == 0) {
105+
++j;
106+
}
107+
}
108+
}
109+
return ans;
110+
}
111+
}
112+
```
113+
114+
### **C++**
115+
116+
```cpp
117+
class Solution {
118+
public:
119+
vector<vector<int>> findRLEArray(vector<vector<int>>& encoded1, vector<vector<int>>& encoded2) {
120+
vector<vector<int>> ans;
121+
int j = 0;
122+
for (auto& e : encoded1) {
123+
int vi = e[0], fi = e[1];
124+
while (fi) {
125+
int f = min(fi, encoded2[j][1]);
126+
int v = vi * encoded2[j][0];
127+
if (!ans.empty() && ans.back()[0] == v) {
128+
ans.back()[1] += f;
129+
} else {
130+
ans.push_back({v, f});
131+
}
132+
fi -= f;
133+
encoded2[j][1] -= f;
134+
if (encoded2[j][1] == 0) {
135+
++j;
136+
}
137+
}
138+
}
139+
return ans;
140+
}
141+
};
142+
```
71143
144+
### **Go**
145+
146+
```go
147+
func findRLEArray(encoded1 [][]int, encoded2 [][]int) (ans [][]int) {
148+
j := 0
149+
for _, e := range encoded1 {
150+
vi, fi := e[0], e[1]
151+
for fi > 0 {
152+
f := min(fi, encoded2[j][1])
153+
v := vi * encoded2[j][0]
154+
if len(ans) > 0 && ans[len(ans)-1][0] == v {
155+
ans[len(ans)-1][1] += f
156+
} else {
157+
ans = append(ans, []int{v, f})
158+
}
159+
fi -= f
160+
encoded2[j][1] -= f
161+
if encoded2[j][1] == 0 {
162+
j++
163+
}
164+
}
165+
}
166+
return
167+
}
168+
169+
func min(a, b int) int {
170+
if a < b {
171+
return a
172+
}
173+
return b
174+
}
72175
```
73176

74177
### **...**
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public:
3+
vector<vector<int>> findRLEArray(vector<vector<int>>& encoded1, vector<vector<int>>& encoded2) {
4+
vector<vector<int>> ans;
5+
int j = 0;
6+
for (auto& e : encoded1) {
7+
int vi = e[0], fi = e[1];
8+
while (fi) {
9+
int f = min(fi, encoded2[j][1]);
10+
int v = vi * encoded2[j][0];
11+
if (!ans.empty() && ans.back()[0] == v) {
12+
ans.back()[1] += f;
13+
} else {
14+
ans.push_back({v, f});
15+
}
16+
fi -= f;
17+
encoded2[j][1] -= f;
18+
if (encoded2[j][1] == 0) {
19+
++j;
20+
}
21+
}
22+
}
23+
return ans;
24+
}
25+
};
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
func findRLEArray(encoded1 [][]int, encoded2 [][]int) (ans [][]int) {
2+
j := 0
3+
for _, e := range encoded1 {
4+
vi, fi := e[0], e[1]
5+
for fi > 0 {
6+
f := min(fi, encoded2[j][1])
7+
v := vi * encoded2[j][0]
8+
if len(ans) > 0 && ans[len(ans)-1][0] == v {
9+
ans[len(ans)-1][1] += f
10+
} else {
11+
ans = append(ans, []int{v, f})
12+
}
13+
fi -= f
14+
encoded2[j][1] -= f
15+
if encoded2[j][1] == 0 {
16+
j++
17+
}
18+
}
19+
}
20+
return
21+
}
22+
23+
func min(a, b int) int {
24+
if a < b {
25+
return a
26+
}
27+
return b
28+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public List<List<Integer>> findRLEArray(int[][] encoded1, int[][] encoded2) {
3+
List<List<Integer>> ans = new ArrayList<>();
4+
int j = 0;
5+
for (var e : encoded1) {
6+
int vi = e[0], fi = e[1];
7+
while (fi > 0) {
8+
int f = Math.min(fi, encoded2[j][1]);
9+
int v = vi * encoded2[j][0];
10+
int m = ans.size();
11+
if (m > 0 && ans.get(m - 1).get(0) == v) {
12+
ans.get(m - 1).set(1, ans.get(m - 1).get(1) + f);
13+
} else {
14+
ans.add(new ArrayList<>(List.of(v, f)));
15+
}
16+
fi -= f;
17+
encoded2[j][1] -= f;
18+
if (encoded2[j][1] == 0) {
19+
++j;
20+
}
21+
}
22+
}
23+
return ans;
24+
}
25+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution:
2+
def findRLEArray(self, encoded1: List[List[int]], encoded2: List[List[int]]) -> List[List[int]]:
3+
ans = []
4+
j = 0
5+
for vi, fi in encoded1:
6+
while fi:
7+
f = min(fi, encoded2[j][1])
8+
v = vi * encoded2[j][0]
9+
if ans and ans[-1][0] == v:
10+
ans[-1][1] += f
11+
else:
12+
ans.append([v, f])
13+
fi -= f
14+
encoded2[j][1] -= f
15+
if encoded2[j][1] == 0:
16+
j += 1
17+
return ans

0 commit comments

Comments
 (0)