611. 有效三角形的个数
This commit is contained in:
parent
74255bbe8b
commit
6e2610c882
150
src/main.rs
150
src/main.rs
|
|
@ -1,143 +1,29 @@
|
||||||
use std::cmp::max;
|
|
||||||
use std::collections::{HashMap, HashSet};
|
|
||||||
|
|
||||||
mod arr;
|
mod arr;
|
||||||
|
struct Solution {}
|
||||||
|
|
||||||
#[derive(Hash, Eq, PartialEq, Clone)]
|
impl Solution {
|
||||||
struct Node {
|
pub fn triangle_number(nums: Vec<i32>) -> i32 {
|
||||||
source: i32,
|
if nums.len() < 3 {
|
||||||
destination: i32,
|
return 0;
|
||||||
timestamp: i32
|
}
|
||||||
}
|
let mut nums = nums;
|
||||||
struct MpNode {
|
nums.sort();
|
||||||
nodes: Vec<i32>,
|
let mut ans = 0;
|
||||||
start: usize
|
for i in 0..nums.len() - 2 {
|
||||||
}
|
let mut r = i + 2;
|
||||||
struct Router {
|
for l in i + 1..nums.len() - 1 {
|
||||||
set : HashSet<Node>,
|
while r < nums.len() && nums[i] + nums[l] > nums[r] {
|
||||||
arr : Vec<Node>,
|
r += 1;
|
||||||
start: usize,
|
|
||||||
limit: i32,
|
|
||||||
mp : HashMap<i32, MpNode>
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* `&self` means the method takes an immutable reference.
|
|
||||||
* If you need a mutable reference, change it to `&mut self` instead.
|
|
||||||
*/
|
|
||||||
// source 开始 destination 结束 timestamp 时间戳
|
|
||||||
// memoryLimit 内存限制
|
|
||||||
impl Router {
|
|
||||||
|
|
||||||
fn new(memory_limit: i32) -> Self {
|
|
||||||
let router = Router {
|
|
||||||
set: HashSet::new(),
|
|
||||||
arr: vec![],
|
|
||||||
start: 0,
|
|
||||||
limit: memory_limit,
|
|
||||||
mp: HashMap::new()
|
|
||||||
};
|
|
||||||
router
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_packet(&mut self, source: i32, destination: i32, timestamp: i32) -> bool {
|
|
||||||
let node = Node {
|
|
||||||
source,
|
|
||||||
destination,
|
|
||||||
timestamp
|
|
||||||
};
|
|
||||||
if self.set.contains(&node) {
|
|
||||||
false
|
|
||||||
} else {
|
|
||||||
self.set.insert(node.clone());
|
|
||||||
self.arr.push(node.clone());
|
|
||||||
if let Some(mp_node) = self.mp.get_mut(&destination) {
|
|
||||||
mp_node.nodes.push(timestamp);
|
|
||||||
}else {
|
|
||||||
let mp_node = MpNode {
|
|
||||||
nodes: vec![timestamp],
|
|
||||||
start: 0
|
|
||||||
};
|
|
||||||
self.mp.insert(destination, mp_node);
|
|
||||||
}
|
|
||||||
if self.arr.len() - self.start > self.limit as usize {
|
|
||||||
let remove_node = &self.arr[self.start];
|
|
||||||
self.set.remove(remove_node);
|
|
||||||
let destination = remove_node.destination;
|
|
||||||
self.start += 1;
|
|
||||||
if let Some(mp_node) = self.mp.get_mut(&destination) {
|
|
||||||
mp_node.start += 1;
|
|
||||||
}else {
|
|
||||||
print!("error occur {source} {destination} {timestamp}");
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn forward_packet(&mut self) -> Vec<i32> {
|
ans += ((r - l) as i32 - 1).max(0);
|
||||||
if self.arr.len() == self.start {
|
}
|
||||||
return vec![];
|
|
||||||
}
|
|
||||||
let mut ans = vec![];
|
|
||||||
let node = &self.arr[self.start];
|
|
||||||
ans.push(node.source);
|
|
||||||
ans.push(node.destination);
|
|
||||||
ans.push(node.timestamp);
|
|
||||||
self.set.remove(&self.arr[self.start]);
|
|
||||||
self.start += 1;
|
|
||||||
if let Some(node_mp) = self.mp.get_mut(&node.destination) {
|
|
||||||
node_mp.start += 1;
|
|
||||||
}
|
}
|
||||||
ans
|
ans
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_count(&self, destination: i32, start_time: i32, end_time: i32) -> i32 {
|
|
||||||
let mut mp_node = match self.mp.get(&destination) {
|
|
||||||
Some(v) => v,
|
|
||||||
None => return 0
|
|
||||||
};
|
|
||||||
let mut l: i32 = 0;
|
|
||||||
let mut r: i32 = 0;
|
|
||||||
match mp_node.nodes.binary_search(&(start_time - 1)) {
|
|
||||||
Ok(mut v) => {
|
|
||||||
while v < mp_node.nodes.len() && mp_node.nodes[v] == start_time - 1 {
|
|
||||||
v+=1;
|
|
||||||
}
|
|
||||||
l = v as i32;
|
|
||||||
}
|
|
||||||
Err(v) => l = v as i32
|
|
||||||
}
|
|
||||||
match mp_node.nodes.binary_search(&(end_time+1)) {
|
|
||||||
Ok(v) => {
|
|
||||||
let mut v = v as i32;
|
|
||||||
while v >= 0 && mp_node.nodes[v as usize] == end_time + 1 {
|
|
||||||
v-=1;
|
|
||||||
}
|
|
||||||
r = v + 1;
|
|
||||||
}
|
|
||||||
Err(v) => r = v as i32
|
|
||||||
}
|
|
||||||
l = max(l , mp_node.start as i32);
|
|
||||||
max(r - l, 0)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let data = vec![vec![4], vec![2,3,1], vec![5,3,2],vec![3,1,1],vec![3,1,1],vec![2,4,2],vec![4,3,2],vec![]];
|
let arr = vec![7, 0, 0, 0];
|
||||||
let methods = vec!["Router","addPacket","addPacket","getCount","getCount","addPacket","addPacket","forwardPacket"];
|
println!("{}", Solution::triangle_number(arr));
|
||||||
let mut obj = Router::new(data[0][0]);
|
|
||||||
for i in 1..methods.len() {
|
|
||||||
if methods[i] == "addPacket" {
|
|
||||||
let ret: bool = obj.add_packet(data[i][0], data[i][1], data[i][2]);
|
|
||||||
println!("{:?}", ret);
|
|
||||||
} else if methods[i] == "forwardPacket" {
|
|
||||||
let ret: Vec<i32> = obj.forward_packet();
|
|
||||||
println!("{:?}", ret);
|
|
||||||
} else if methods[i] == "getCount" {
|
|
||||||
let ret: i32 = obj.get_count(data[i][0], data[i][1], data[i][2]);
|
|
||||||
println!("{:?}", ret);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue