257.二叉树的所有路径 1984.学生分数的最小差值 老大哥在看着你

This commit is contained in:
游由 2022-02-11 11:27:27 +08:00
parent 828c769814
commit 6be230c7c4
3 changed files with 144 additions and 0 deletions

View File

@ -49,6 +49,7 @@ mod q0213;
mod q0220;
mod q0226;
mod q0231;
mod q0257;
mod q0258;
mod q0263;
mod q0264;
@ -113,4 +114,5 @@ mod q1486;
mod q1720;
mod q1723;
mod q1734;
mod q1984;
mod q2006;

View File

@ -0,0 +1,77 @@
use crate::Solution;
use crate::structure::TreeNode;
use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
/// [257.二叉树的所有路径](https://leetcode-cn.com/problems/binary-tree-paths/)
///
/// 2022-02-11 10:10:27
///
/// 给你一个二叉树的根节点 `root` ,按 **任意顺序** ,返回所有从根节点到叶子节点的路径。
///
/// > **叶子节点** 是指没有子节点的节点。
///
/// + **示例 1**
/// + ![](https://assets.leetcode.com/uploads/2021/03/12/paths-tree.jpg)
/// + **输入:** root = \[1,2,3,null,5\]
/// + **输出:** \["1->2->5","1->3"\]
/// + **示例 2**
/// + **输入:** root = \[1\]
/// + **输出:** \["1"\]
/// + **提示:**
/// * 树中节点的数目在范围 `[1, 100]` 内
/// * `-100 <= Node.val <= 100`
/// + Related Topics
/// * 树
/// * 深度优先搜索
/// * 字符串
/// * 回溯
/// * 二叉树
/// * 👍 644
/// * 👎 0
pub fn binary_tree_paths(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<String> {
fn helper(root: &Option<Rc<RefCell<TreeNode>>>, mut path: Vec<i32>, ans: &mut Vec<String>) {
match root {
Some(node) => {
let p = node.borrow();
path.push(p.val);
if p.left.is_none() && p.right.is_none() {
ans.push(path.into_iter().map(|val| val.to_string()).collect::<Vec<String>>().join("->"));
} else {
if p.left.is_some() { helper(&p.left, path.clone(), ans); }
if p.right.is_some() { helper(&p.right, path.clone(), ans); }
}
}
_ => {}
}
}
let mut ans = Vec::<String>::new();
helper(&root, Vec::<i32>::new(), &mut ans);
ans
}
}
#[cfg(test)]
mod test {
use crate::Solution;
use crate::structure::TreeNode;
use std::rc::Rc;
use std::cell::RefCell;
#[test]
fn test_q0257() {
let tree = Some(Rc::new(RefCell::new(TreeNode {
val: 1,
left: Some(Rc::new(RefCell::new(TreeNode {
val: 2,
left: None,
right: Some(Rc::new(RefCell::new(TreeNode::new(5)))),
}))),
right: Some(Rc::new(RefCell::new(TreeNode::new(3)))),
})));
let ans = vec!["1->2->5".to_string(), "1->3".to_string()];
assert_eq!(Solution::binary_tree_paths(tree), ans);
}
}

View File

@ -0,0 +1,65 @@
use crate::Solution;
impl Solution {
/// [1984.学生分数的最小差值](https://leetcode-cn.com/problems/minimum-difference-between-highest-and-lowest-of-k-scores/)
///
/// 2022-02-11 11:01:30
///
/// 给你一个 **下标从 0 开始** 的整数数组 `nums` ,其中 `nums[i]` 表示第 `i` 名学生的分数。另给你一个整数 `k` 。
///
/// 从数组中选出任意 `k` 名学生的分数,使这 `k` 个分数间 **最高分** 和 **最低分** 的 **差值** 达到 **最小化** 。
///
/// 返回可能的 **最小差值** 。
///
/// + **示例 1**
///
/// + **输入:** nums = \[90\], k = 1
/// + **输出:** 0
/// + **解释:** 选出 1 名学生的分数,仅有 1 种方法:
/// - \[_**90**_\] 最高分和最低分之间的差值是 90 - 90 = 0
/// + 可能的最小差值是 0
///
/// + **示例 2**
///
/// + **输入:** nums = \[9,4,1,7\], k = 2
/// + **输出:** 2
/// + **解释:** 选出 2 名学生的分数,有 6 种方法:
/// - \[_**9**_,_**4**_,1,7\] 最高分和最低分之间的差值是 9 - 4 = 5
/// - \[_**9**_,4,_**1**_,7\] 最高分和最低分之间的差值是 9 - 1 = 8
/// - \[_**9**_,4,1,_**7**_\] 最高分和最低分之间的差值是 9 - 7 = 2
/// - \[9,_**4**_,_**1**_,7\] 最高分和最低分之间的差值是 4 - 1 = 3
/// - \[9,_**4**_,1,_**7**_\] 最高分和最低分之间的差值是 7 - 4 = 3
/// - \[9,4,_**1**_,_**7**_\] 最高分和最低分之间的差值是 7 - 1 = 6
/// + 可能的最小差值是 2
///
/// + **提示:**
/// * `1 <= k <= nums.length <= 1000`
/// * `0 <= nums[i] <= 105`
/// + Related Topics
/// * 数组
/// * 排序
/// * 滑动窗口
/// * 👍 36
/// * 👎 0
pub fn minimum_difference(mut nums: Vec<i32>, k: i32) -> i32 {
let k = k as usize;
if k == 1 {
return 0;
}
nums.sort_unstable();
(k - 1..nums.len()).map(|idx| nums[idx] - nums[idx + 1 - k]).min().unwrap()
}
}
#[cfg(test)]
mod test {
use crate::Solution;
#[test]
fn test_q1984() {
let nums = vec![9,4,1,7];
let k = 2;
assert_eq!(Solution::minimum_difference(nums, k), 2);
}
}