Python Algorithm Features - JangoBoogaloo/LeetCodeExcercise GitHub Wiki

bisect

Instead of manually write binary search. Use bisect_left or bisect_right

accumulate (Prefix Ops: +, *, max ....)

    print(list(accumulate([1, 1, 1, 1, 1])))

    1, 2, 3, 4, 5

cache (Nice trick for DP)

@cache
def factorial(n):
    return n * factorial(n-1) if n else 1

>>> factorial(10)      # no previously cached result, makes 11 recursive calls
3628800
>>> factorial(5)       # just looks up cached value result
120
>>> factorial(12)      # makes two new recursive calls, the other 10 are cached
479001600

⚠️ Manually DP caching might still be faster than decorator

combination

a = ["a", "b", "c"]
print(list(combinations(a, 2)))

[('a', 'b'), ('a', 'c'), ('b', 'c')]

permutation

a = ["a", "b", "c"]
print(list(permutations(a, 2)))

[('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]