Skip to content

Commit ad2840d

Browse files
authored
Merge pull request #1 from leetcode/master
Add out of bounds check for segment tree
2 parents aa63f56 + 5175196 commit ad2840d

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

segmenttree/__init__.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,36 @@ def __init__(self, start, end):
88
self.len_value = {}
99
self._init(start, end)
1010

11-
def add(self, start, end, weight=1):
11+
def out_of_bounds_check(self, start, end):
1212
start = max(start, self.start)
1313
end = min(end, self.end)
14+
if start > end:
15+
return None, None
16+
return start, end
17+
18+
def add(self, start, end, weight=1):
19+
start, end = self.out_of_bounds_check(start, end)
20+
if start is None:
21+
return False
1422
self._add(start, end, weight, self.start, self.end)
1523
return True
1624

1725
def query_max(self, start, end):
26+
start, end = self.out_of_bounds_check(start, end)
27+
if start is None:
28+
return None
1829
return self._query_max(start, end, self.start, self.end)
1930

2031
def query_sum(self, start, end):
32+
start, end = self.out_of_bounds_check(start, end)
33+
if start is None:
34+
return 0
2135
return self._query_sum(start, end, self.start, self.end)
2236

2337
def query_len(self, start, end):
38+
start, end = self.out_of_bounds_check(start, end)
39+
if start is None:
40+
return 0
2441
return self._query_len(start, end, self.start, self.end)
2542

2643
""""""

tests/test_segtree.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,5 +50,45 @@ def test_empty(self):
5050
self.assertEqual(2, segtree.query_len(0, 8))
5151
self.assertEqual(2, segtree.query_sum(0, 8))
5252

53+
def test_full_out_of_bound(self):
54+
segtree = SegmentTree(0, 8)
55+
segtree.add(0, 8)
56+
57+
# Test full out of bound adding element fails
58+
self.assertEqual(False, segtree.add(10, 16))
59+
self.assertEqual(False, segtree.add(-16, -10))
60+
61+
# Test full out of bound len query returns 0
62+
self.assertEqual(0, segtree.query_len(10, 16))
63+
self.assertEqual(0, segtree.query_len(-16, -10))
64+
65+
# Test full out of bounds len query returns 0
66+
self.assertEqual(0, segtree.query_sum(10, 16))
67+
self.assertEqual(0, segtree.query_sum(-16, -10))
68+
69+
# Test full out of bounds max query returns None
70+
self.assertEqual(None, segtree.query_max(10, 16))
71+
self.assertEqual(None, segtree.query_max(-16, -10))
72+
73+
def test_partial_out_of_bound(self):
74+
segtree = SegmentTree(0, 8)
75+
segtree.add(0, 8)
76+
77+
# Test partial out of bound adding element
78+
self.assertEqual(True, segtree.add(8, 16))
79+
self.assertEqual(True, segtree.add(-16, 0))
80+
81+
# Test partial out of bound len query
82+
self.assertEqual(2, segtree.query_len(7, 16))
83+
self.assertEqual(2, segtree.query_len(-16, 1))
84+
85+
# Test partial out of bounds len query
86+
self.assertEqual(3, segtree.query_sum(7, 16))
87+
self.assertEqual(3, segtree.query_sum(-16, 1))
88+
89+
# Test full out of bounds max query
90+
self.assertEqual(2, segtree.query_max(7, 16))
91+
self.assertEqual(2, segtree.query_max(-16, 1))
92+
5393
if __name__ == '__main__':
5494
main()

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy