[lc-rs] 树|建桥贪心
lc200
DFS遍历网格:遇到'1'就标记为'2'并递归探索上下左右相邻格子,统计独立'1'区域数量即岛屿数
impl Solution {
pub fn num_islands(mut grid: Vec<Vec<char>>) -> i32 {
fn dfs(grid: &mut Vec<Vec<char>>, i: usize, j: usize) {
// 出界,或者不是 '1',就不再往下递归
if i >= grid.len() || j >= grid[i].len() || grid[i][j] != '1' {
return;
}
grid[i][j] = '2'; // 插旗!避免来回横跳无限递归
dfs(grid, i, j - 1); // 往左走
dfs(grid, i, j + 1); // 往右走
dfs(grid, i - 1, j); // 往上走
dfs(grid, i + 1, j); // 往下走
}
let mut ans = 0;
for i in 0..grid.len() {
for j in 0..grid[i].len() {
if grid[i][j] == '1' { // 找到了一个新的岛
dfs(&mut grid, i, j); // 把这个岛插满旗子,这样后面遍历到的 '1' 一定是新的岛
ans += 1;
}
}
}
ans
}
}
lc45
贪心算法找最少跳跃次数:
遍历中记录当前能到的最右点,到边界时更新边界并计数,直到覆盖终点
impl Solution {
pub fn jump(nums: Vec<i32>) -> i32 {
let mut ans = 0;
let mut cur_right = 0; // 已建造的桥的右端点
let mut next_right = 0; // 下一座桥的右端点的最大值
for i in 0..nums.len()-1 {
// 遍历的过程中,记录下一座桥的最远点
next_right = next_right.max(i as i32 + nums[i]);
if i as i32 == cur_right { // 无路可走,必须建桥
cur_right = next_right; // 建桥后,最远可以到达 next_right
ans += 1;
}
}
ans
}
}
lc226
use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
pub fn invert_tree(root: Option<Rc<RefCell<TreeNode>>>) -> Option<Rc<RefCell<TreeNode>>> {
if let Some(node) = root {
let left = Self::invert_tree(node.borrow_mut().left.take()); // 翻转左子树
let right = Self::invert_tree(node.borrow_mut().right.take()); // 翻转右子树
node.borrow_mut().left = right; // 交换左右儿子
node.borrow_mut().right = left;
Some(node)
} else {
None
}
}
}
