Skip to content

Commit 5920db5

Browse files
authored
feat: add solutions to lc problem: No.3479 (#4621)
No.3479.Fruits Into Baskets III
1 parent bbe24c7 commit 5920db5

File tree

8 files changed

+1267
-8
lines changed

8 files changed

+1267
-8
lines changed

solution/3400-3499/3479.Fruits Into Baskets III/README.md

Lines changed: 427 additions & 4 deletions
Large diffs are not rendered by default.

solution/3400-3499/3479.Fruits Into Baskets III/README_EN.md

Lines changed: 427 additions & 4 deletions
Large diffs are not rendered by default.
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
class SegmentTree {
2+
public:
3+
vector<int> nums, tr;
4+
5+
SegmentTree(vector<int>& nums) {
6+
this->nums = nums;
7+
int n = nums.size();
8+
tr.resize(n * 4);
9+
build(1, 1, n);
10+
}
11+
12+
void build(int u, int l, int r) {
13+
if (l == r) {
14+
tr[u] = nums[l - 1];
15+
return;
16+
}
17+
int mid = (l + r) >> 1;
18+
build(u * 2, l, mid);
19+
build(u * 2 + 1, mid + 1, r);
20+
pushup(u);
21+
}
22+
23+
void modify(int u, int l, int r, int i, int v) {
24+
if (l == r) {
25+
tr[u] = v;
26+
return;
27+
}
28+
int mid = (l + r) >> 1;
29+
if (i <= mid) {
30+
modify(u * 2, l, mid, i, v);
31+
} else {
32+
modify(u * 2 + 1, mid + 1, r, i, v);
33+
}
34+
pushup(u);
35+
}
36+
37+
int query(int u, int l, int r, int v) {
38+
if (tr[u] < v) {
39+
return -1;
40+
}
41+
if (l == r) {
42+
return l;
43+
}
44+
int mid = (l + r) >> 1;
45+
if (tr[u * 2] >= v) {
46+
return query(u * 2, l, mid, v);
47+
}
48+
return query(u * 2 + 1, mid + 1, r, v);
49+
}
50+
51+
void pushup(int u) {
52+
tr[u] = max(tr[u * 2], tr[u * 2 + 1]);
53+
}
54+
};
55+
56+
class Solution {
57+
public:
58+
int numOfUnplacedFruits(vector<int>& fruits, vector<int>& baskets) {
59+
SegmentTree tree(baskets);
60+
int n = baskets.size();
61+
int ans = 0;
62+
for (int x : fruits) {
63+
int i = tree.query(1, 1, n, x);
64+
if (i < 0) {
65+
ans++;
66+
} else {
67+
tree.modify(1, 1, n, i, 0);
68+
}
69+
}
70+
return ans;
71+
}
72+
};
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
type SegmentTree struct {
2+
nums, tr []int
3+
}
4+
5+
func NewSegmentTree(nums []int) *SegmentTree {
6+
n := len(nums)
7+
tree := &SegmentTree{
8+
nums: nums,
9+
tr: make([]int, n*4),
10+
}
11+
tree.build(1, 1, n)
12+
return tree
13+
}
14+
15+
func (st *SegmentTree) build(u, l, r int) {
16+
if l == r {
17+
st.tr[u] = st.nums[l-1]
18+
return
19+
}
20+
mid := (l + r) >> 1
21+
st.build(u*2, l, mid)
22+
st.build(u*2+1, mid+1, r)
23+
st.pushup(u)
24+
}
25+
26+
func (st *SegmentTree) modify(u, l, r, i, v int) {
27+
if l == r {
28+
st.tr[u] = v
29+
return
30+
}
31+
mid := (l + r) >> 1
32+
if i <= mid {
33+
st.modify(u*2, l, mid, i, v)
34+
} else {
35+
st.modify(u*2+1, mid+1, r, i, v)
36+
}
37+
st.pushup(u)
38+
}
39+
40+
func (st *SegmentTree) query(u, l, r, v int) int {
41+
if st.tr[u] < v {
42+
return -1
43+
}
44+
if l == r {
45+
return l
46+
}
47+
mid := (l + r) >> 1
48+
if st.tr[u*2] >= v {
49+
return st.query(u*2, l, mid, v)
50+
}
51+
return st.query(u*2+1, mid+1, r, v)
52+
}
53+
54+
func (st *SegmentTree) pushup(u int) {
55+
st.tr[u] = max(st.tr[u*2], st.tr[u*2+1])
56+
}
57+
58+
func numOfUnplacedFruits(fruits []int, baskets []int) (ans int) {
59+
tree := NewSegmentTree(baskets)
60+
n := len(baskets)
61+
for _, x := range fruits {
62+
i := tree.query(1, 1, n, x)
63+
if i < 0 {
64+
ans++
65+
} else {
66+
tree.modify(1, 1, n, i, 0)
67+
}
68+
}
69+
return
70+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
class SegmentTree {
2+
int[] nums;
3+
int[] tr;
4+
5+
public SegmentTree(int[] nums) {
6+
this.nums = nums;
7+
int n = nums.length;
8+
this.tr = new int[n << 2];
9+
build(1, 1, n);
10+
}
11+
12+
public void build(int u, int l, int r) {
13+
if (l == r) {
14+
tr[u] = nums[l - 1];
15+
return;
16+
}
17+
int mid = (l + r) >> 1;
18+
build(u << 1, l, mid);
19+
build(u << 1 | 1, mid + 1, r);
20+
pushup(u);
21+
}
22+
23+
public void modify(int u, int l, int r, int i, int v) {
24+
if (l == r) {
25+
tr[u] = v;
26+
return;
27+
}
28+
int mid = (l + r) >> 1;
29+
if (i <= mid) {
30+
modify(u << 1, l, mid, i, v);
31+
} else {
32+
modify(u << 1 | 1, mid + 1, r, i, v);
33+
}
34+
pushup(u);
35+
}
36+
37+
public int query(int u, int l, int r, int v) {
38+
if (tr[u] < v) {
39+
return -1;
40+
}
41+
if (l == r) {
42+
return l;
43+
}
44+
int mid = (l + r) >> 1;
45+
if (tr[u << 1] >= v) {
46+
return query(u << 1, l, mid, v);
47+
}
48+
return query(u << 1 | 1, mid + 1, r, v);
49+
}
50+
51+
public void pushup(int u) {
52+
tr[u] = Math.max(tr[u << 1], tr[u << 1 | 1]);
53+
}
54+
}
55+
56+
class Solution {
57+
public int numOfUnplacedFruits(int[] fruits, int[] baskets) {
58+
SegmentTree tree = new SegmentTree(baskets);
59+
int n = baskets.length;
60+
int ans = 0;
61+
for (int x : fruits) {
62+
int i = tree.query(1, 1, n, x);
63+
if (i < 0) {
64+
ans++;
65+
} else {
66+
tree.modify(1, 1, n, i, 0);
67+
}
68+
}
69+
return ans;
70+
}
71+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
class SegmentTree:
2+
__slots__ = ["nums", "tr"]
3+
4+
def __init__(self, nums):
5+
self.nums = nums
6+
n = len(nums)
7+
self.tr = [0] * (n << 2)
8+
self.build(1, 1, n)
9+
10+
def build(self, u, l, r):
11+
if l == r:
12+
self.tr[u] = self.nums[l - 1]
13+
return
14+
mid = (l + r) >> 1
15+
self.build(u << 1, l, mid)
16+
self.build(u << 1 | 1, mid + 1, r)
17+
self.pushup(u)
18+
19+
def modify(self, u, l, r, i, v):
20+
if l == r:
21+
self.tr[u] = v
22+
return
23+
mid = (l + r) >> 1
24+
if i <= mid:
25+
self.modify(u << 1, l, mid, i, v)
26+
else:
27+
self.modify(u << 1 | 1, mid + 1, r, i, v)
28+
self.pushup(u)
29+
30+
def query(self, u, l, r, v):
31+
if self.tr[u] < v:
32+
return -1
33+
if l == r:
34+
return l
35+
mid = (l + r) >> 1
36+
if self.tr[u << 1] >= v:
37+
return self.query(u << 1, l, mid, v)
38+
return self.query(u << 1 | 1, mid + 1, r, v)
39+
40+
def pushup(self, u):
41+
self.tr[u] = max(self.tr[u << 1], self.tr[u << 1 | 1])
42+
43+
44+
class Solution:
45+
def numOfUnplacedFruits(self, fruits: List[int], baskets: List[int]) -> int:
46+
tree = SegmentTree(baskets)
47+
n = len(baskets)
48+
ans = 0
49+
for x in fruits:
50+
i = tree.query(1, 1, n, x)
51+
if i < 0:
52+
ans += 1
53+
else:
54+
tree.modify(1, 1, n, i, 0)
55+
return ans
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
struct SegmentTree<'a> {
2+
nums: &'a [i32],
3+
tr: Vec<i32>,
4+
}
5+
6+
impl<'a> SegmentTree<'a> {
7+
fn new(nums: &'a [i32]) -> Self {
8+
let n = nums.len();
9+
let mut tree = SegmentTree {
10+
nums,
11+
tr: vec![0; n * 4],
12+
};
13+
tree.build(1, 1, n);
14+
tree
15+
}
16+
17+
fn build(&mut self, u: usize, l: usize, r: usize) {
18+
if l == r {
19+
self.tr[u] = self.nums[l - 1];
20+
return;
21+
}
22+
let mid = (l + r) >> 1;
23+
self.build(u * 2, l, mid);
24+
self.build(u * 2 + 1, mid + 1, r);
25+
self.pushup(u);
26+
}
27+
28+
fn modify(&mut self, u: usize, l: usize, r: usize, i: usize, v: i32) {
29+
if l == r {
30+
self.tr[u] = v;
31+
return;
32+
}
33+
let mid = (l + r) >> 1;
34+
if i <= mid {
35+
self.modify(u * 2, l, mid, i, v);
36+
} else {
37+
self.modify(u * 2 + 1, mid + 1, r, i, v);
38+
}
39+
self.pushup(u);
40+
}
41+
42+
fn query(&self, u: usize, l: usize, r: usize, v: i32) -> i32 {
43+
if self.tr[u] < v {
44+
return -1;
45+
}
46+
if l == r {
47+
return l as i32;
48+
}
49+
let mid = (l + r) >> 1;
50+
if self.tr[u * 2] >= v {
51+
return self.query(u * 2, l, mid, v);
52+
}
53+
self.query(u * 2 + 1, mid + 1, r, v)
54+
}
55+
56+
fn pushup(&mut self, u: usize) {
57+
self.tr[u] = self.tr[u * 2].max(self.tr[u * 2 + 1]);
58+
}
59+
}
60+
61+
impl Solution {
62+
pub fn num_of_unplaced_fruits(fruits: Vec<i32>, baskets: Vec<i32>) -> i32 {
63+
let mut tree = SegmentTree::new(&baskets);
64+
let n = baskets.len();
65+
let mut ans = 0;
66+
for &x in fruits.iter() {
67+
let i = tree.query(1, 1, n, x);
68+
if i < 0 {
69+
ans += 1;
70+
} else {
71+
tree.modify(1, 1, n, i as usize, 0);
72+
}
73+
}
74+
ans
75+
}
76+
}

0 commit comments

Comments
 (0)