1536. 排布二进制网格的最少交换次数

This commit is contained in:
li_chx 2026-03-02 14:26:28 +08:00
parent 495075eef2
commit 1772ba6c99
Signed by: li_chx
GPG Key ID: 70D4985BB8180E92
1 changed files with 41 additions and 17 deletions

View File

@ -1,26 +1,50 @@
use std::cmp::Ordering;
struct Solution; struct Solution;
mod arr; mod arr;
impl Solution { impl Solution {
pub fn sort_by_bits(arr: Vec<i32>) -> Vec<i32> { pub fn min_swaps(grid: Vec<Vec<i32>>) -> i32 {
let mut arr= arr.iter().map(|&x| ->(i32,i32){ fn count_tail_zero(arr: &Vec<i32>) -> i32 {
(x,x.count_ones() as i32) let mut cnt = 0;
}).collect::<Vec<(i32,i32)>>(); for i in (0..arr.len()).rev() {
arr.sort_unstable_by(|a,b|-> Ordering { if arr[i] == 0 {
let res = a.1.cmp(&b.1); cnt += 1;
match res { } else {
Ordering::Equal => a.0.cmp(&b.0), return cnt;
_ => res, }
} }
}); cnt
arr.iter().map(|&(x,_)| x).collect() }
let mut arr = Vec::<i32>::with_capacity(grid.len());
for i in 0..grid[0].len() {
arr.push(count_tail_zero(&grid[i]))
}
let mut cnt = 0;
for i in (0..grid.len()).rev() {
let mut index = 0;
let mut cant = true;
for j in 0..arr.len() {
if arr[j] == -1 {
continue;
}
if arr[j] >= i as i32 {
arr[j] = -1;
cnt += index;
cant = false;
break;
}
index += 1;
}
if cant{
return -1;
}
}
cnt
} }
} }
fn main() { fn main() {
let result = Solution::sort_by_bits( let result = Solution::min_swaps(arr::make_matrix(
vec![0,1,2,3,4,5,6,7,8] "[[0,0,1],[1,1,0],[1,0,0]]",
); ));
println!("{:?}", result); println!("{:?}", result);
} }