Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 277c0a9

Browse files
committed
backtracking
1 parent 68c1885 commit 277c0a9

File tree

6 files changed

+145
-1
lines changed

6 files changed

+145
-1
lines changed

‎src/combination_sum.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
pub struct Solution {}
2+
impl Solution {
3+
pub fn combination_sum(candidates: Vec<i32>, target: i32) -> Vec<Vec<i32>> {
4+
fn rec(
5+
i: usize,
6+
candidates: &Vec<i32>,
7+
subset: &mut Vec<i32>,
8+
res: &mut Vec<Vec<i32>>,
9+
target: i32,
10+
mut sum: i32,
11+
) {
12+
if i >= candidates.len() || sum > target {
13+
return;
14+
}
15+
if sum == target {
16+
res.push(subset.clone());
17+
return;
18+
}
19+
subset.push(candidates[i]);
20+
rec(i, candidates, subset, res, target, sum + candidates[i]);
21+
let n = subset.pop().unwrap();
22+
rec(i + 1, candidates, subset, res, target, sum);
23+
}
24+
25+
let mut res: Vec<Vec<i32>> = Vec::new();
26+
let mut subset: Vec<i32> = Vec::new();
27+
rec(0, &candidates, &mut subset, &mut res, target, 0);
28+
res
29+
}
30+
}

‎src/find_median_data_stream.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use std::cmp::Reverse;
2+
use std::collections::BinaryHeap;
3+
struct MedianFinder {
4+
min: BinaryHeap<Reverse<i32>>,
5+
max: BinaryHeap<i32>,
6+
}
7+
8+
/**
9+
* `&self` means the method takes an immutable reference.
10+
* If you need a mutable reference, change it to `&mut self` instead.
11+
*/
12+
impl MedianFinder {
13+
fn new() -> Self {
14+
MedianFinder {
15+
min: BinaryHeap::new(),
16+
max: BinaryHeap::new(),
17+
}
18+
}
19+
20+
fn add_num(&mut self, num: i32) {
21+
self.max.push(num);
22+
if self.min.peek().is_some() && self.max.peek().is_some() {
23+
if self.min.peek().unwrap().0 > *self.max.peek().unwrap() {
24+
self.min.push(Reverse(self.max.pop().unwrap()));
25+
}
26+
}
27+
if self.max.len() > 1 + self.min.len() {
28+
self.min.push(Reverse(self.max.pop().unwrap()));
29+
} else if self.min.len() > 1 + self.max.len() {
30+
self.max.push(self.min.pop().unwrap().0);
31+
}
32+
}
33+
34+
fn find_median(&self) -> f64 {
35+
if self.min.len() > self.max.len() {
36+
return self.min.peek().unwrap().0 as f64;
37+
} else if self.max.len() > self.min.len() {
38+
return *self.max.peek().unwrap() as f64;
39+
}
40+
(self.min.peek().unwrap().0 + self.max.peek().unwrap()) as f64 / 2.0
41+
}
42+
}

‎src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
mod design_twitter;
1+
mod subsets_two;
22
fn main() {}

‎src/permutations.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
pub struct Solution {}
2+
impl Solution {
3+
pub fn permute(nums: Vec<i32>) -> Vec<Vec<i32>> {
4+
use std::collections::VecDeque;
5+
let mut deque: VecDeque<i32> = VecDeque::from(nums);
6+
fn rec(mut nums: VecDeque<i32>) -> Vec<Vec<i32>> {
7+
let mut r = Vec::new();
8+
if nums.len() == 1 {
9+
let mut res = Vec::new();
10+
res.push(nums.clone().into());
11+
return res;
12+
}
13+
for i in 0..nums.len() {
14+
let n = nums.pop_front().unwrap();
15+
let mut perms = rec(nums.clone());
16+
for perm in &mut perms {
17+
perm.push(n);
18+
}
19+
nums.push_back(n);
20+
r.extend(perms.clone());
21+
}
22+
23+
return r;
24+
}
25+
let mut res = Vec::new();
26+
res.extend(rec(deque));
27+
res
28+
}
29+
}

‎src/subsets.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
pub struct Solution {}
2+
impl Solution {
3+
pub fn subsets(nums: Vec<i32>) -> Vec<Vec<i32>> {
4+
fn rec(i: usize, nums: Vec<i32>, res: &mut Vec<Vec<i32>>, sub: &mut Vec<i32>) {
5+
if i >= nums.len() {
6+
res.push(sub.clone());
7+
return;
8+
}
9+
sub.push(nums[i]);
10+
rec(i + 1, nums.clone(), res, sub);
11+
sub.pop();
12+
rec(i + 1, nums.clone(), res, sub);
13+
}
14+
let mut res: Vec<Vec<i32>> = Vec::new();
15+
let mut sub: Vec<i32> = Vec::new();
16+
rec(0, nums, &mut res, &mut sub);
17+
res
18+
}
19+
}

‎src/subsets_two.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
pub struct Solution {}
2+
impl Solution {
3+
pub fn subsets_with_dup(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
4+
fn rec(mut i: usize, res: &mut Vec<Vec<i32>>, subset: &mut Vec<i32>, nums: &Vec<i32>) {
5+
if i >= nums.len() {
6+
res.push(subset.clone());
7+
return;
8+
}
9+
subset.push(nums[i]);
10+
rec(i + 1, res, subset, nums);
11+
subset.pop();
12+
while i + 1 < nums.len() && nums[i] == nums[i + 1] {
13+
i += 1;
14+
}
15+
rec(i + 1, res, subset, nums);
16+
}
17+
18+
let mut res = Vec::new();
19+
let mut subset = Vec::new();
20+
nums.sort();
21+
rec(0, &mut res, &mut subset, &nums);
22+
res
23+
}
24+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /