# CSPT19 Lecture 8 ## [Binary Search](https://leetcode.com/problems/binary-search/) ``` class Solution: def search(self, nums: List[int], target: int) -> int: return self.searchHelper(nums, 0, len(nums) - 1, target) def searchHelper(nums, start, end, target): if start > end: return -1 mid = (start + end) // 2 if nums[mid] == target: return mid elif nums[mid] < target: return self.searchHelper(nums, mid + 1, end, target) else: return self.searchHelper(nums, start, mid - 1, target) def iterativeBinarySearch(nums, target): start, end = 0, len(nums) - 1 while start <= end: mid = (start + end) // 2 if nums[mid] == target: return mid elif nums[mid] < target: start = mid + 1 else: end = mid - 1 return -1 ``` ## [Guess Higher or Lower](https://leetcode.com/problems/guess-number-higher-or-lower/) ``` class Solution: def guessNumber(self, n: int) -> int: start, end = 1, n while start <= end: mid = (start + end) // 2 res = guess(mid) if res == 0: return mid elif res == -1: end = mid - 1 else: start = mid + 1 return -1 ``` ## [First Bad Version](https://leetcode.com/problems/first-bad-version/) ``` class Solution: def firstBadVersion(self, n): """ :type n: int :rtype: int """ start, end = 1, n while start <= end: mid = (start + end) // 2 if isBadVersion(mid): end = mid - 1 else: start = mid + 1 return start ``` ## Misc ``` def printAllValues(nums): for n in nums: print(n) def printAllValuesRecursive(nums): printAllValuesRecursiveHelper(nums, 0) def printAllValuesRecursiveHelper(nums, currIndex): if currIndex >= len(nums): return print(nums[currIndex]) printAllValuesRecursiveHelper(nums, currIndex + 1) printAllValuesRecursive([1,2,3]) def factorial(n): if n == 0 or n == 1: return 1 return n * factorial(n - 1) print(factorial(5)) // 5 * 4 * 3 * 2 * 1 //fib(n) = fib(n - 1) + fib(n - 2) // 0, 1, 1, 2, 3, 5, 8, ... def fib(n): if n == 0: return 0 if n == 1: return 1 return fib(n - 1) + fib(n - 2) def tabFib(n): fibs = [0, 1] for i in range(2, n + 1): fibs.append(fibs[i - 1] + fibs[i - 2]) return fibs[n] ```