small-lambda
Senior Member
Code:
use std::collections::*;
impl Solution {
pub fn min_k_bit_flips(nums: Vec<i32>, k: i32) -> i32 {
let (n, uk) = (nums.len(), k as usize);
let (mut flip_queue, mut flip_state, mut result) = (VecDeque::new(), 0, 0);
for (i, num) in nums.into_iter().enumerate() {
if i >= uk {
flip_state ^= flip_queue[0];
}
if flip_state == num {
if i + uk > n {
return - 1;
}
flip_queue.push_back(1);
flip_state ^= 1;
result += 1;
} else {
flip_queue.push_back(0);
}
if flip_queue.len() > uk {
flip_queue.pop_front();
}
}
result
}
}
Code:
use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
pub fn bst_to_gst(root: Option<Rc<RefCell<TreeNode>>>) -> Option<Rc<RefCell<TreeNode>>> {
type Tree = Rc<RefCell<TreeNode>>;
fn build_and_sum(node_option: Option<&Tree>, top_right_sum: i32) -> (Option<Tree>, i32) {
match node_option {
Some(node) => {
let val = node.borrow().val;
let mut new_node = TreeNode::new(val);
let (new_right, right_sum) =
build_and_sum(node.borrow().right.as_ref(), top_right_sum);
let (new_left, left_sum) =
build_and_sum(node.borrow().left.as_ref(), val + right_sum + top_right_sum);
new_node.val += right_sum + top_right_sum;
new_node.left = new_left;
new_node.right = new_right;
(
Some(Rc::new(RefCell::new(new_node))),
val + left_sum + right_sum
)
},
None => (None, 0)
}
}
build_and_sum(root.as_ref(), 0).0
}
}
Code:
use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
pub fn balance_bst(root: Option<Rc<RefCell<TreeNode>>>) -> Option<Rc<RefCell<TreeNode>>> {
type Tree = Rc<RefCell<TreeNode>>;
fn flatten(node_option: Option<&Tree>, vals: &mut Vec<i32>) {
match node_option {
Some(node) => {
flatten(node.borrow().left.as_ref(), vals);
vals.push(node.borrow().val);
flatten(node.borrow().right.as_ref(), vals);
},
None => ()
}
}
fn build_balanced(vals: &[i32]) -> Option<Tree> {
if vals.len() == 0 {
return None;
}
let mid = vals.len() / 2;
Some(Rc::new(RefCell::new(TreeNode {
val: vals[mid],
left: build_balanced(&vals[..mid]),
right: build_balanced(&vals[(mid + 1)..])
})))
}
let mut vals = vec![];
flatten(root.as_ref(), &mut vals);
build_balanced(&vals)
}
}
Code:
use std::collections::*;
impl Solution {
pub fn find_center(edges: Vec<Vec<i32>>) -> i32 {
let mut edge_map = HashMap::new();
for edge in edges {
let u = edge[0];
let v = edge[1];
edge_map.entry(u).and_modify(|count| *count += 1).or_insert(1);
edge_map.entry(v).and_modify(|count| *count += 1).or_insert(1);
}
let n = edge_map.len();
for (vertex, count) in edge_map {
if count == n - 1 {
return vertex;
}
}
-1
}
}