Skip to content

Commit 0d6d624

Browse files
authored
feat: add solutions to lcp problem: No.39 (doocs#1533)
No.39.无人机方阵
1 parent 6363b69 commit 0d6d624

File tree

6 files changed

+200
-1
lines changed

6 files changed

+200
-1
lines changed

lcp/LCP 39. 无人机方阵/README.md

+110-1
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,131 @@
4646

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

49+
**方法一:哈希表计数**
50+
51+
我们可以用哈希表 $cnt$ 统计 $source$ 和 $target$ 中每个数字出现的次数之差。对于 $cnt$ 中的每个数字 $x$,如果 $x$ 的出现次数为正数,那么说明 $x$ 在 $target$ 中出现的次数多,我们需要将 $x$ 出现的次数减少到 $0$。因此,我们只需要累加所有出现次数为正数的数字的出现次数之和,即为答案。
52+
53+
时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是 $source$ 和 $target$ 的行数和列数。
54+
4955
<!-- tabs:start -->
5056

5157
### **Python3**
5258

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

5561
```python
56-
62+
class Solution:
63+
def minimumSwitchingTimes(
64+
self, source: List[List[int]], target: List[List[int]]
65+
) -> int:
66+
cnt = Counter()
67+
for row in source:
68+
for x in row:
69+
cnt[x] += 1
70+
for row in target:
71+
for x in row:
72+
cnt[x] -= 1
73+
return sum(abs(x) for x in cnt.values()) // 2
5774
```
5875

5976
### **Java**
6077

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

6380
```java
81+
class Solution {
82+
public int minimumSwitchingTimes(int[][] source, int[][] target) {
83+
Map<Integer, Integer> cnt = new HashMap<>();
84+
for (int[] row : source) {
85+
for (int x : row) {
86+
cnt.merge(x, 1, Integer::sum);
87+
}
88+
}
89+
for (int[] row : target) {
90+
for (int x : row) {
91+
cnt.merge(x, -1, Integer::sum);
92+
}
93+
}
94+
int ans = 0;
95+
for (int v : cnt.values()) {
96+
ans += Math.abs(v);
97+
}
98+
return ans / 2;
99+
}
100+
}
101+
```
102+
103+
### **C++**
104+
105+
```cpp
106+
class Solution {
107+
public:
108+
int minimumSwitchingTimes(vector<vector<int>>& source, vector<vector<int>>& target) {
109+
unordered_map<int, int> cnt;
110+
for (auto& row : source) {
111+
for (int& x : row) {
112+
++cnt[x];
113+
}
114+
}
115+
for (auto& row : target) {
116+
for (int& x : row) {
117+
--cnt[x];
118+
}
119+
}
120+
int ans = 0;
121+
for (auto& [_, v] : cnt) {
122+
ans += abs(v);
123+
}
124+
return ans / 2;
125+
}
126+
};
127+
```
128+
129+
### **Go**
130+
131+
```go
132+
func minimumSwitchingTimes(source [][]int, target [][]int) (ans int) {
133+
cnt := map[int]int{}
134+
for _, row := range source {
135+
for _, x := range row {
136+
cnt[x]++
137+
}
138+
}
139+
for _, row := range target {
140+
for _, x := range row {
141+
cnt[x]--
142+
}
143+
}
144+
for _, v := range cnt {
145+
if v > 0 {
146+
ans += v
147+
}
148+
}
149+
return
150+
}
151+
```
64152

153+
### **TypeScript**
154+
155+
```ts
156+
function minimumSwitchingTimes(source: number[][], target: number[][]): number {
157+
const cnt: Map<number, number> = new Map();
158+
for (const row of source) {
159+
for (const x of row) {
160+
cnt.set(x, (cnt.get(x) || 0) + 1);
161+
}
162+
}
163+
for (const row of target) {
164+
for (const x of row) {
165+
cnt.set(x, (cnt.get(x) || 0) - 1);
166+
}
167+
}
168+
let ans = 0;
169+
for (const [_, v] of cnt) {
170+
ans += Math.abs(v);
171+
}
172+
return Math.floor(ans / 2);
173+
}
65174
```
66175

67176
### **...**
+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public:
3+
int minimumSwitchingTimes(vector<vector<int>>& source, vector<vector<int>>& target) {
4+
unordered_map<int, int> cnt;
5+
for (auto& row : source) {
6+
for (int& x : row) {
7+
++cnt[x];
8+
}
9+
}
10+
for (auto& row : target) {
11+
for (int& x : row) {
12+
--cnt[x];
13+
}
14+
}
15+
int ans = 0;
16+
for (auto& [_, v] : cnt) {
17+
ans += abs(v);
18+
}
19+
return ans / 2;
20+
}
21+
};
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
func minimumSwitchingTimes(source [][]int, target [][]int) (ans int) {
2+
cnt := map[int]int{}
3+
for _, row := range source {
4+
for _, x := range row {
5+
cnt[x]++
6+
}
7+
}
8+
for _, row := range target {
9+
for _, x := range row {
10+
cnt[x]--
11+
}
12+
}
13+
for _, v := range cnt {
14+
if v > 0 {
15+
ans += v
16+
}
17+
}
18+
return
19+
}
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public int minimumSwitchingTimes(int[][] source, int[][] target) {
3+
Map<Integer, Integer> cnt = new HashMap<>();
4+
for (int[] row : source) {
5+
for (int x : row) {
6+
cnt.merge(x, 1, Integer::sum);
7+
}
8+
}
9+
for (int[] row : target) {
10+
for (int x : row) {
11+
cnt.merge(x, -1, Integer::sum);
12+
}
13+
}
14+
int ans = 0;
15+
for (int v : cnt.values()) {
16+
ans += Math.abs(v);
17+
}
18+
return ans / 2;
19+
}
20+
}
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def minimumSwitchingTimes(
3+
self, source: List[List[int]], target: List[List[int]]
4+
) -> int:
5+
cnt = Counter()
6+
for row in source:
7+
for x in row:
8+
cnt[x] += 1
9+
for row in target:
10+
for x in row:
11+
cnt[x] -= 1
12+
return sum(abs(x) for x in cnt.values()) // 2
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
function minimumSwitchingTimes(source: number[][], target: number[][]): number {
2+
const cnt: Map<number, number> = new Map();
3+
for (const row of source) {
4+
for (const x of row) {
5+
cnt.set(x, (cnt.get(x) || 0) + 1);
6+
}
7+
}
8+
for (const row of target) {
9+
for (const x of row) {
10+
cnt.set(x, (cnt.get(x) || 0) - 1);
11+
}
12+
}
13+
let ans = 0;
14+
for (const [_, v] of cnt) {
15+
ans += Math.abs(v);
16+
}
17+
return Math.floor(ans / 2);
18+
}

0 commit comments

Comments
 (0)