LCP 39. 无人机方阵
在 「力扣挑战赛」 开幕式的压轴节目 「无人机方阵」中,每一架无人机展示一种灯光颜色。 无人机方阵通过两种操作进行颜色图案变换:
给定两个大小均为 N*M
的二维数组 source
和 target
表示无人机方阵表演的两种颜色图案,由于无人机切换灯光颜色的耗能很大,请返回从 source
到 target
最少需要多少架无人机切换灯光颜色。
注意: 调整无人机的位置布局时无人机的位置可以随意变动。
示例 1:
输入:
source = [[1,3],[5,4]], target = [[3,1],[6,5]]
输出:
1
解释: 最佳方案为 将
[0,1]
处的无人机移动至[0,0]
处; 将[0,0]
处的无人机移动至[0,1]
处; 将[1,0]
处的无人机移动至[1,1]
处; 将[1,1]
处的无人机移动至[1,0]
处,其灯光颜色切换为颜色编号为6
的灯光; 因此从source
到target
所需要的最少灯光切换次数为 1。{:height=300px}
示例 2:
输入:
source = [[1,2,3],[3,4,5]], target = [[1,3,5],[2,3,4]]
输出:
0
解释: 仅需调整无人机的位置布局,便可完成图案切换。因此不需要无人机切换颜色
提示:
n == source.length == target.length
m == source[i].length == target[i].length
1 <= n, m <=100
1 <= source[i][j], target[i][j] <=10^4
原站题解
rust 解法, 执行用时: 28 ms, 内存消耗: 2.5 MB, 提交时间: 2023-09-13 15:42:09
impl Solution { // 基于hash pub fn minimum_switching_times(source: Vec<Vec<i32>>, target: Vec<Vec<i32>>) -> i32 { let mut map = std::collections::HashMap::new(); let mut acc = 0; for i in source.iter() { for j in i.iter() { let cnt = map.entry(j).or_insert(0); *cnt += 1; } } for i in target.iter() { for j in i.iter() { if !map.contains_key(j) { acc += 1; } else { let cnt = map.entry(j).or_insert(0); *cnt -= 1; } } } -1 * map.iter().map(|(_, &val)| val).filter(|x| x < &0).sum::<i32>() + acc } // 简单模拟 pub fn minimum_switching_times2(source: Vec<Vec<i32>>, target: Vec<Vec<i32>>) -> i32 { let n = source.len(); let m = source[0].len(); let mut cnt = vec![0;10005]; for i in 0..n*m { cnt[source[i/m][i%m] as usize] += 1; cnt[target[i/m][i%m] as usize] -= 1; } cnt.into_iter().fold(0, |acc, x| if x > 0 { acc + x } else { acc }) } }
golang 解法, 执行用时: 116 ms, 内存消耗: 7.8 MB, 提交时间: 2023-09-13 15:40:56
func minimumSwitchingTimes(source, target [][]int) (ans int) { cnt := map[int]int{} for i, row := range source { for j, v := range row { cnt[v]++ cnt[target[i][j]]-- } } for _, c := range cnt { ans += abs(c) } return ans / 2 } func abs(x int) int { if x < 0 { return -x }; return x }
cpp 解法, 执行用时: 108 ms, 内存消耗: 34.9 MB, 提交时间: 2023-09-13 15:39:55
class Solution { public: int minimumSwitchingTimes(vector<vector<int>>& source, vector<vector<int>>& target) { int ans = 0; vector<int> p(10006, 0); int m = source.size(), n = source[0].size(); for ( int i = 0; i < n * m; ++i ) { p[source[i/n][i%n]]++; p[target[i/n][i%n]]--; } for ( int i = 0; i < 10006; ++i ) { if ( p[i] > 0 ) { ans += p[i]; } } return ans; } };
java 解法, 执行用时: 4 ms, 内存消耗: 42.9 MB, 提交时间: 2023-09-13 15:36:59
class Solution { public int minimumSwitchingTimes(int[][] source, int[][] target) { int ans = 0; int[] p = new int[10006]; int m = source.length, n = source[0].length; for ( int i = 0; i < n * m; ++i ) { p[source[i/n][i%n]]++; p[target[i/n][i%n]]--; } for ( int i = 0; i < 10006; ++i ) { if ( p[i] > 0 ) { ans += p[i]; } } return ans; } }
php 解法, 执行用时: 224 ms, 内存消耗: 22.9 MB, 提交时间: 2023-09-13 15:34:11
class Solution { /** * @param Integer[][] $source * @param Integer[][] $target * @return Integer */ function minimumSwitchingTimes($source, $target) { $ans = 0; $p = array_fill(0, 10006, 0); $m = count($source); $n = count($source[0]); for ( $i = 0; $i < $n * $m; $i++ ) { $p[$source[intval($i/$n)][$i%$n]]++; $p[$target[intval($i/$n)][$i%$n]]--; } for ( $i = 0; $i < 10006; $i++ ) { if ( $p[$i] > 0 ) $ans += $p[$i]; } return $ans; } }
python3 解法, 执行用时: 144 ms, 内存消耗: 17.7 MB, 提交时间: 2023-09-13 15:31:11
class Solution: def minimumSwitchingTimes(self, source: List[List[int]], target: List[List[int]]) -> int: ans = 0 p = [0 for _ in range(10006)] m, n = len(source), len(source[0]) for i in range(m * n): p[source[i//n][i%n]] += 1 p[target[i//n][i%n]] -= 1 for i in range(10006): if p[i] > 0: ans += p[i] return ans
golang 解法, 执行用时: 140 ms, 内存消耗: 7.3 MB, 提交时间: 2021-09-22 16:26:49
func minimumSwitchingTimes(source [][]int, target [][]int) int { ans := 0 p := make([]int, 1e4+6) m, n := len(source), len(source[0]) for i := 0; i < n * m; i ++ { p[source[i/n][i%n]]++ p[target[i/n][i%n]]-- } for i := 0; i < 1e4 + 6; i++ { if p[i] > 0 { ans += p[i] } } return ans }