From 50510dd3aca8d865d42b3827f2591f7de1d651f0 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Mon, 31 Dec 2018 15:56:25 -0800 Subject: [PATCH 001/489] valid mountain array - lt easy 100 pass --- ProblemSolving/validMountainArray/valid.py | 106 +++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 ProblemSolving/validMountainArray/valid.py diff --git a/ProblemSolving/validMountainArray/valid.py b/ProblemSolving/validMountainArray/valid.py new file mode 100644 index 0000000..2b91189 --- /dev/null +++ b/ProblemSolving/validMountainArray/valid.py @@ -0,0 +1,106 @@ +class Solution(object): + def validMountainArray(self, A): + """ + :type A: List[int] + :rtype: bool + """ + + # Condition 1 + if len(A) < 3: + return False + + # Condition 2 + # We have to go to the highest and then reverse to the lowest from there + # A[0].<..A[max]..>.A[n] + + # 100 pass 64 ms faster + # 2 pointer logic to meet at the peak + n = len(A) + left = 0 + right = n-1 + + # Climbing mountain from left to obtain the peak + while left < n-1 and A[left] < A[left+1]: + left += 1 + + # Climbing mountain from right to obtain peak + while right > 0 and A[right] < A[right-1]: + right -= 1 + + # Climbing both sides should have left us at the peak + # Also peak should not be at the start of the end + if left == right and left > 0 and left < n-1: + return True + + return False + + + """ + # 100 pass 64 ms faster + # Break down logic of solving each condition separate + + # Find maximum peak + peak = max(A) + + # There should be only one peak + if A.count(peak) > 1: + return False + + # Index of peak + peak_index = A.index(peak) + + # Peak should not be present in the beginning or the end + if peak_index == len(A)-1 or peak_index == 0: + return False + + # Iterate upward to peak + for i in range(0, peak_index): + if A[i] >= A[i+1]: + return False + + # Iterate downward from peak + for i in range(peak_index+1, len(A)): + if i+1 < len(A) and A[i] <= A[i+1]: + return False + + return True + """ + + """ + # Not 100 pass + # Just compare if both sides of the peak are sorted + # This also fails when both the elements are equal occurring continuously, add check + + peak = max(A) + if A.count(peak) > 1: + return False + peak_index = A.index(peak) + + + if sorted(A[:peak_index+1]) == A[:peak_index+1] and sorted(A[peak_index:]) == A[peak_index:][::-1]: + return True + else: + return False + """ + + """ + # Not 100 pass + # Simple technique - There is should be only one time when the max fall takes place A[i] > A[i+1] else it is not a mountain + # Con: this runs through the full loop though.... + # - this also doesnt work when equal numbers exist + peak = 0 + while A: + current = A.pop() + if A and current > A[-1]: + print A, current + peak += 1 + if peak != 1: + return False + else: + return True + """ + + + + + From 8adb52e9bb3002c31f88e05e78863f2a5e17ca42 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Tue, 1 Jan 2019 22:41:34 -0800 Subject: [PATCH 002/489] find mode in bst - with extra space - lt easy 100 pass --- .../findModeInBinarySearchTree/find.py | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 ProblemSolving/findModeInBinarySearchTree/find.py diff --git a/ProblemSolving/findModeInBinarySearchTree/find.py b/ProblemSolving/findModeInBinarySearchTree/find.py new file mode 100644 index 0000000..c01b4fa --- /dev/null +++ b/ProblemSolving/findModeInBinarySearchTree/find.py @@ -0,0 +1,46 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def findMode(self, root): + """ + :type root: TreeNode + :rtype: List[int] + """ + + # Using extra space logic + # * a dictionary with all the values + self.freq = {} + + def traverse(node): + # Null node handle + if not node: + return + + if node.val not in self.freq: + self.freq[node.val] = 1 + else: + self.freq[node.val] += 1 + + if node.left: + traverse(node.left) + if node.right: + traverse(node.right) + + if not root: + return [] + + traverse(root) + + result = [] + mode = max(self.freq.values()) + for value, count in self.freq.items(): + if count == mode: + result.append(value) + return result + + From 1fb541793a087d51a06856e9f8690baa7e6d9f21 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Wed, 2 Jan 2019 22:10:26 -0800 Subject: [PATCH 003/489] Add files via upload --- ProblemSolving/assignCookie/assign.py | 62 +++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 ProblemSolving/assignCookie/assign.py diff --git a/ProblemSolving/assignCookie/assign.py b/ProblemSolving/assignCookie/assign.py new file mode 100644 index 0000000..6bb27b1 --- /dev/null +++ b/ProblemSolving/assignCookie/assign.py @@ -0,0 +1,62 @@ +class Solution(object): + def findContentChildren(self, g, s): + """ + :type g: List[int] + :type s: List[int] + :rtype: int + """ + + # 100 pass - 76ms 42.78% faster + # Using extra variable to count, simpler logic + # To maximize satisfaction, lets particularly sort the arrays + + # Sort the arrays so they are both in increasing order + g.sort() + s.sort() + + # Initial point to start + child, cookie = 0, 0 + + # result + content = 0 + + # Iterate through both the arrays + while child < len(g) and cookie < len(s): + # Found a content child + if s[cookie] >= g[child]: + content += 1 + child += 1 + cookie += 1 + else: + # Iterate cookie until a content cookie is found for respective child + cookie += 1 + + return content + + + """ + # 100 pass - 176 ms 11.55% faster + # Logic of deleting entries from list (Kinda like stacks), trying without using extra variable or result list + # Use children + cookie list as a stack + # * Pop child from chidren when their greed cannot be satisfied + # * Pop cookie from cookies when they are given to children + + g.sort() + s.sort() + + i, j = 0, 0 + while i < len(g): + while j < len(s) and s[j] < g[i]: + j += 1 + if j == len(s): + g.pop(i) + else: + s.pop(j) + i += 1 + return len(g) + """ + + + + + From ee47b8589e7b0b7f09d4fc6524b964bf74f451c9 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Wed, 2 Jan 2019 22:49:23 -0800 Subject: [PATCH 004/489] :bridge_at_night: reach number lt easy - 100 pass (pending on greedy logic) --- ProblemSolving/reachNumber/reach.py | 78 +++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 ProblemSolving/reachNumber/reach.py diff --git a/ProblemSolving/reachNumber/reach.py b/ProblemSolving/reachNumber/reach.py new file mode 100644 index 0000000..7bb7c99 --- /dev/null +++ b/ProblemSolving/reachNumber/reach.py @@ -0,0 +1,78 @@ +class Solution(object): + def reachNumber(self, target): + """ + :type target: int + :rtype: int + """ + + """ + # Logic 1: Own greedy approach (pending... not complete) + # This does not give minimum number of steps... + + # target == 0 condition + if target == 0: + return 0 + + # Initial starting point set to 0 + start = 0 + + # This can go 2 ways + # * At every step or number, we could go -n or +n and further like that (it tapers down as a tree and the best path (min) should be selected.) + # --> Greedy or Dynamic Prog? + # Let's do greedy + # * Every time we move towards the targets which would be the closest to the target + # * We avoid the steps which would make use greater than target + step = 0 + target = abs(target) + while start != target: + step += 1 + if start+step > target: + start -= step + else: + start += step + print start, step + return step + """ + + + # 100 pass - 100 ms runtime 19.02 faster + # Mathematical solution + # Based on https://leetcode.com/problems/reach-a-number/discuss/112968/Short-JAVA-Solution-with-Explanation + + # Always move towards the target (Right) + # * If the sum exceeds target + # - Exceed until the difference is even (this makes sure there can be some left motions to succeed) + + step = 0 + start = 0 + + # Number line is identical on both sides. Lets consider one side always and calculate the result + + target = abs(target) + + # Move right side until target is equaled or just exceeded + while start < target: + step += 1 + start += step + + while (start - target) % 2 != 0: + step += 1 + start += step + + return step + + + + + + + + + + + + + + + + From 494cbd95ec5cc1eb6d5fcbe56295f202e42ddd41 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Thu, 3 Jan 2019 08:57:45 -0800 Subject: [PATCH 005/489] :city_sunrise: lt easy binary search 100 pass --- ProblemSolving/binarySearch/bin.py | 85 ++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 ProblemSolving/binarySearch/bin.py diff --git a/ProblemSolving/binarySearch/bin.py b/ProblemSolving/binarySearch/bin.py new file mode 100644 index 0000000..764d742 --- /dev/null +++ b/ProblemSolving/binarySearch/bin.py @@ -0,0 +1,85 @@ +class Solution(object): + def search(self, nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: int + """ + + # Binary search is Half n Half. + # * Always check for half and choose most promising + + # 2 pointer technique - to memorize the indexes as we move through the array without altering the array to perform the search should be apt... + + # Init + left = 0 + right = len(nums)-1 + + # Dividing by 2 and setting pointers as we proceed + while left < right: + mid = (left + right)//2 + print left, mid, right + if nums[mid] == target: + return mid + elif nums[mid] < target: + left = mid + else: + right = mid + + # Smallest array condition (when the array is of length 2) + if (right - left) == 1: + if nums[right] == target: + return right + elif nums[left] == target: + return left + else: + return -1 + + # Equal or single element condition + if left == right and nums[left] == target: + return left + + # no match condition + return -1 + + """ + # Binary search works in the below logic, existence returned + # * Maintaining the index is not done here + while nums: + n = len(nums) + mid = n//2 + if nums[mid] == target: + return True + elif nums[mid] < target: + nums = nums[mid:] + else: + nums = nums[:mid] + return False + """ + + """" + # Altering same logic as above (for existence to crack) + # * Maintaining the index left and right is a challenge + + start_index = 0 + + if nums[start_index] == target: + return 0 + + while len(nums) > 1: + n = len(nums) + mid = n//2 + if nums[mid] == target: + if (start_index + mid) < start_index: + return start_index - mid - 1 + else: + return start_index + mid + elif nums[mid] < target: + nums = nums[mid:] + else: + nums = nums[:mid] + start_index += mid + return -1 + """ + + From b209e48fb9be25b8473e139b6aa951b695efa774 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Sat, 5 Jan 2019 12:41:28 -0800 Subject: [PATCH 006/489] leaf similar trees - lt easy 100 pass --- ProblemSolving/leafSimilarTrees/leaf.py | 67 +++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 ProblemSolving/leafSimilarTrees/leaf.py diff --git a/ProblemSolving/leafSimilarTrees/leaf.py b/ProblemSolving/leafSimilarTrees/leaf.py new file mode 100644 index 0000000..a20f4a4 --- /dev/null +++ b/ProblemSolving/leafSimilarTrees/leaf.py @@ -0,0 +1,67 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def leafSimilar(self, root1, root2): + """ + :type root1: TreeNode + :type root2: TreeNode + :rtype: bool + """ + + # Dictionary to store the value of the leaves for each tree + self.leaves = { + root1: [], + root2: [] + } + + # Null check + if not root1 or not root2: + return False + + # Traverse tree function + def get_leaves(root, node): + + # debug + """ + print node.val + if node.left: + print node.left.val + if node.right: + print node.right.val + print "debug end!" + """ + + # When node is None check + if not node: + return + + # detect Children + if node.left == None and node.right == None: + self.leaves[root].append(node.val) + + # Traverse nodes (Lesson: Use if loops not elif/else as it looks for only one possibility as we traverse) + if node.left: + get_leaves(root, node.left) + if node.right: + get_leaves(root, node.right) + + + get_leaves(root1, root1) + get_leaves(root2, root2) + + # Debug + #print self.leaves[root1], self.leaves[root2] + + if self.leaves[root1] == self.leaves[root2]: + return True + else: + return False + + #else: + # leaf ==> [node.left == None and node.right == None] + # self.leaves[root].append(node.val) From bef422c3a2fb675c3b13fa1ccae4d052b0a5cc04 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Sat, 5 Jan 2019 12:43:17 -0800 Subject: [PATCH 007/489] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 7648edd..345badb 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ * [Sorting](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/AlgorithmConcepts/sorting) ### Problem Solving: +Has all the problem solving question solution (mostly in python, updating in different languages are welcome!) * [Balanced Brackets](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/BalancedBrackets) * [equiLeader](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/equiLeader) @@ -231,6 +232,11 @@ * Java * Swift +### Commit Information +* Every commit has a key called + - lt => leetcode + - hr => hackerrank + ### Links and References: * Leetcode - https://leetcode.com/srinivas11789/ * HackerRank - https://www.hackerrank.com/spg349 From 410330a6a1c410db034e370caa9064d6721b7400 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Sat, 5 Jan 2019 12:51:31 -0800 Subject: [PATCH 008/489] update readme with problemSolving links --- README.md | 547 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 375 insertions(+), 172 deletions(-) diff --git a/README.md b/README.md index 345badb..84f1e8c 100644 --- a/README.md +++ b/README.md @@ -24,208 +24,411 @@ ### Problem Solving: Has all the problem solving question solution (mostly in python, updating in different languages are welcome!) -* [Balanced Brackets](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/BalancedBrackets) +* [judgeRouteCircle](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/judgeRouteCircle) +* [arriveAtK](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/arriveAtK) +* [expressiveWords](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/expressiveWords) +* [romanToNumeral](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/romanToNumeral) +* [sherlockAndValidString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sherlockAndValidString) +* [printBinaryTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/printBinaryTree) +* [dominator](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/dominator) +* [keyboardRow](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/keyboardRow) +* [heaters](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/heaters) +* [removeDuplicatesFromSortedList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/removeDuplicatesFromSortedList) +* [removeElement](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/removeElement) +* [firstBadVersion](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/firstBadVersion) +* [photoName](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/photoName) +* [palindromeIndex](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/palindromeIndex) +* [findKClosestElements](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findKClosestElements) +* [naryTreeLevelOrderTraversal](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/naryTreeLevelOrderTraversal) +* [findBottomLeftTreeValue](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findBottomLeftTreeValue) +* [iceCreamParlour](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/iceCreamParlour) +* [deleteAndEarn](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/deleteAndEarn) +* [findMinTimeDifference](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findMinTimeDifference) +* [sumOfSquareNumbers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sumOfSquareNumbers) +* [rotateString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/rotateString) +* [diStringMatch](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/diStringMatch) +* [longestContinuousIncreasingSequence](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/longestContinuousIncreasingSequence) +* [needleHaystack](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/needleHaystack) +* [studentAttendanceRecord1](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/studentAttendanceRecord1) +* [absDistinctValues](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/absDistinctValues) +* [isomorphicString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/isomorphicString) +* [mostCommonWord](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/mostCommonWord) +* [caesarCipher](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/caesarCipher) +* [findModeInBinarySearchTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findModeInBinarySearchTree) +* [containsDuplicates](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/containsDuplicates) +* [palindromicSubstrings](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/palindromicSubstrings) +* [interface](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/interface) +* [distinctElements](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/distinctElements) +* [productExceptSelf](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/productExceptSelf) +* [divisibleSumPairs](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/divisibleSumPairs) +* [uncommonWordsFromTwoSentence](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/uncommonWordsFromTwoSentence) +* [beautifulDaysAtMovies](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/beautifulDaysAtMovies) +* [containerWithMostWater](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/containerWithMostWater) +* [tapeEquillibrium](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/tapeEquillibrium) +* [minPerimeterRectangle](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minPerimeterRectangle) +* [searchRange](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/searchRange) +* [deleteOperationForTwoStrings](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/deleteOperationForTwoStrings) +* [mergeIntervals](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/mergeIntervals) +* [validPerfectSquare](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/validPerfectSquare) +* [minimumAbsoluteDifference](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minimumAbsoluteDifference) +* [validPalindrome](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/validPalindrome) +* [levelOrderTraversal](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/levelOrderTraversal) +* [nextGreaterElementI](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/nextGreaterElementI) +* [numberSolitaire](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/numberSolitaire) +* [positionOfLargeGroups](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/positionOfLargeGroups) +* [reverseString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/reverseString) +* [CoinsCounting](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/CoinsCounting) +* [intersectionOfTwoLinkedList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/intersectionOfTwoLinkedList) +* [classesMoreThan5Students](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/classesMoreThan5Students) +* [nonOverlappSegments](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/nonOverlappSegments) +* [longestCommonPrefix](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/longestCommonPrefix) +* [validAnagram](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/validAnagram) +* [flags](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/flags) +* [implementTriePrefixTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/implementTriePrefixTree) +* [triesContacts](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/triesContacts) +* [uniqMorseCodeWords](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/uniqMorseCodeWords) +* [deleteDuplicateEmails](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/deleteDuplicateEmails) +* [simpleDatabase](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/simpleDatabase) +* [binaryTreePaths](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/binaryTreePaths) +* [findAllDuplicatesInAnArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findAllDuplicatesInAnArray) +* [excelSheelColumnNumber](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/excelSheelColumnNumber) +* [scoreOfParanthesis](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/scoreOfParanthesis) +* [tennisTournament](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/tennisTournament) +* [mapSumPairs](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/mapSumPairs) +* [mergeSortedLists](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/mergeSortedLists) +* [WordCount](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/WordCount) +* [lowestCommonAncestorOfABinaryTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/lowestCommonAncestorOfABinaryTree) +* [minimumTimeDifference](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minimumTimeDifference) +* [degreeOfAnArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/degreeOfAnArray) +* [reachNumber](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/reachNumber) +* [subTreeOfAnotherTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/subTreeOfAnotherTree) +* [mergeSortedArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/mergeSortedArray) +* [countTriangles](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/countTriangles) +* [minHeightBst](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minHeightBst) +* [binaryTreeInOrderTraversal](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/binaryTreeInOrderTraversal) +* [lonelyInteger](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/lonelyInteger) +* [deleteNode](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/deleteNode) +* [luckBalance](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/luckBalance) +* [twoSumsIV](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/twoSumsIV) +* [ransomNote](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/ransomNote) +* [reverseStringII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/reverseStringII) +* [funnyString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/funnyString) +* [nextGreaterElementII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/nextGreaterElementII) +* [priyankatoys](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/priyankatoys) +* [bfsBST](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/bfsBST) +* [fairCandySwap](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/fairCandySwap) +* [customSortString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/customSortString) +* [makingAnagrams](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/makingAnagrams) +* [peakIndexInMountainArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/peakIndexInMountainArray) +* [reverseVowels](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/reverseVowels) +* [anagram](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/anagram) +* [teemoAttacking](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/teemoAttacking) +* [DepthBST](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/DepthBST) +* [convertNumberToHexadecimal](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/convertNumberToHexadecimal) +* [132pattern](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/132pattern) +* [isPalindromeInteger](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/isPalindromeInteger) +* [subdomainVisitCount](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/subdomainVisitCount) +* [bfsShortestReach](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/bfsShortestReach) +* [Pairs](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/Pairs) +* [maximumBinaryTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maximumBinaryTree) +* [setMismatch](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/setMismatch) +* [linkedListComponents](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/linkedListComponents) +* [rankScores](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/rankScores) +* [repeatedStringMatch](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/repeatedStringMatch) +* [countCars](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/countCars) +* [invertBinaryTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/invertBinaryTree) +* [linkedListCycle](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/linkedListCycle) +* [minimumMovesToEqualArrayElements](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minimumMovesToEqualArrayElements) +* [twoLists](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/twoLists) +* [findSmallestLetterGreaterThanTarget](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findSmallestLetterGreaterThanTarget) +* [BalancedBrackets](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/BalancedBrackets) +* [cakeWalk](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/cakeWalk) +* [superReducedString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/superReducedString) +* [middleOfTheLinkedList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/middleOfTheLinkedList) +* [reverseLinkedList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/reverseLinkedList) +* [numBetweenIdenticalValue](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/numBetweenIdenticalValue) +* [CommonChild](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/CommonChild) +* [stringCompression](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/stringCompression) +* [strangeCounter](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/strangeCounter) +* [gameProgs](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/gameProgs) +* [binarySearch](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/binarySearch) +* [singleElementInASortedArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/singleElementInASortedArray) +* [nonDecreasingArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/nonDecreasingArray) +* [semiPrimes](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/semiPrimes) +* [topKFrequentElements](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/topKFrequentElements) +* [sumIntegerWithoutPlus](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sumIntegerWithoutPlus) +* [1bitAnd2bitCharacters](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/1bitAnd2bitCharacters) +* [factorial](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/factorial) +* [maxHeightBst](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maxHeightBst) +* [findPeakElement](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findPeakElement) +* [minStack](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minStack) +* [numberOfLinesToWriteString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/numberOfLinesToWriteString) +* [maximizingXor](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maximizingXor) +* [recursionDavisStaircase](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/recursionDavisStaircase) +* [almostSorted](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/almostSorted) +* [queue2Stacks](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/queue2Stacks) +* [rectangleIntersect](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/rectangleIntersect) +* [bonAppetit](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/bonAppetit) +* [oddOccurrencesArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/oddOccurrencesArray) +* [jumpOutsideArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/jumpOutsideArray) +* [intersectionOfTwoArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/intersectionOfTwoArray) +* [pascalTriangle](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/pascalTriangle) +* [longestHarmoniousSubSequence](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/longestHarmoniousSubSequence) +* [alternateCharacters](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/alternateCharacters) +* [coursesOrder](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/coursesOrder) +* [licenseKeyFormatting](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/licenseKeyFormatting) +* [magicalString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/magicalString) +* [loveLetterMysteryMakePalindrome](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/loveLetterMysteryMakePalindrome) +* [perfectNumber](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/perfectNumber) +* [largestPermutation](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/largestPermutation) +* [numberOfRecentCalls](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/numberOfRecentCalls) +* [countAndSay](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/countAndSay) +* [numberOfSegmentsInAString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/numberOfSegmentsInAString) +* [reverseBits](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/reverseBits) +* [sortedArrayToBST](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sortedArrayToBST) +* [risingTemperature](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/risingTemperature) +* [tenthLine](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/tenthLine) +* [houseRobber](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/houseRobber) +* [reverseInteger](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/reverseInteger) +* [emailAddressCreator](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/emailAddressCreator) +* [sameTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sameTree) +* [encodeDecodeTinyUrl](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/encodeDecodeTinyUrl) +* [tripletMultiple](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/tripletMultiple) +* [nimGame](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/nimGame) +* [counterGame](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/counterGame) +* [addTwoNumbersLinkedList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/addTwoNumbersLinkedList) +* [missingSmallestElement](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/missingSmallestElement) +* [arrangingCoins](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/arrangingCoins) +* [jimAndOrder](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/jimAndOrder) +* [hackerRankInString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/hackerRankInString) +* [makingAnagrams2](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/makingAnagrams2) +* [notBoringMovies](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/notBoringMovies) +* [gameOfThrones1](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/gameOfThrones1) +* [backspaceStringCompare](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/backspaceStringCompare) +* [canPlaceFlowers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/canPlaceFlowers) +* [findAndReplacePattern](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findAndReplacePattern) +* [replaceWords](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/replaceWords) +* [base7](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/base7) +* [toLowerCase](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/toLowerCase) +* [numberComplement](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/numberComplement) +* [findAllNumbersDisappearedInAnArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findAllNumbersDisappearedInAnArray) +* [maxDisjointSetSum](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maxDisjointSetSum) +* [combinationSum](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/combinationSum) +* [factorialTrailingZeros](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/factorialTrailingZeros) +* [levelOrderTraversalII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/levelOrderTraversalII) +* [countZeroBinary](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/countZeroBinary) +* [arrayRotation](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/arrayRotation) +* [shortestDistanceToCharacter](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/shortestDistanceToCharacter) +* [letterCasePermutation](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/letterCasePermutation) +* [kthLargestInAStream](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/kthLargestInAStream) +* [maximizeDistanceToClosestPerson](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maximizeDistanceToClosestPerson) +* [findDuplicateFileInSystem](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findDuplicateFileInSystem) +* [lowestCommonAncestorOfABinarySearchTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/lowestCommonAncestorOfABinarySearchTree) +* [robotSimulator](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/robotSimulator) +* [extraLongFactorials](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/extraLongFactorials) +* [designLinkedList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/designLinkedList) +* [migratingBirds](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/migratingBirds) +* [singleNumber](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/singleNumber) +* [arrayNesting](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/arrayNesting) +* [findMaxAverage](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findMaxAverage) +* [sqrt](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sqrt) +* [simplifyPath](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/simplifyPath) +* [NthDigit](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/NthDigit) * [equiLeader](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/equiLeader) +* [lengthOfLastWord](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/lengthOfLastWord) +* [firstUniqueCharacterInString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/firstUniqueCharacterInString) +* [minCostClimbingStairs](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minCostClimbingStairs) +* [jewelAndStones](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/jewelAndStones) +* [increasingOrderSearchTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/increasingOrderSearchTree) +* [findAnagrams](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findAnagrams) +* [implementQueueUsingStacks](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/implementQueueUsingStacks) +* [letterFreqFix](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/letterFreqFix) +* [maxMin](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maxMin) +* [closestNumbers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/closestNumbers) +* [swapSalary](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/swapSalary) +* [binaryWatch](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/binaryWatch) +* [removeKDigits](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/removeKDigits) +* [sumVsXor](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sumVsXor) +* [saveThePrisoner](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/saveThePrisoner) +* [gradingStudents](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/gradingStudents) +* [climbStairs](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/climbStairs) +* [stringConstruction](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/stringConstruction) +* [shortestUnsortedContinuousubarray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/shortestUnsortedContinuousubarray) +* [flippingBits](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/flippingBits) +* [intersectionOfTwoArrayII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/intersectionOfTwoArrayII) +* [reshapeMatrix](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/reshapeMatrix) +* [perfectBinaryString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/perfectBinaryString) +* [longestPalindrome](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/longestPalindrome) +* [baseballGame](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/baseballGame) +* [rangeSumQueryImmutable](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/rangeSumQueryImmutable) +* [bitManipulationLonelyInteger](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/bitManipulationLonelyInteger) +* [stairCase](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/stairCase) * [longestPassword](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/longestPassword) +* [sortArrayByParityII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sortArrayByParityII) +* [findSecondMinimumInABinaryTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findSecondMinimumInABinaryTree) +* [constructStringFromBinaryTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/constructStringFromBinaryTree) +* [averageOfLevelsInBinaryTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/averageOfLevelsInBinaryTree) +* [rotateList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/rotateList) +* [arrayPartitionI](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/arrayPartitionI) +* [minimumAddToMakeParanthesesValid](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minimumAddToMakeParanthesesValid) +* [buddyStrings](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/buddyStrings) +* [assignCookie](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/assignCookie) +* [subArraySumEqualsK](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/subArraySumEqualsK) +* [happyNumber](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/happyNumber) +* [maximumProductOfWordLengths](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maximumProductOfWordLengths) +* [subSetsII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/subSetsII) +* [toeplitzMatrix](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/toeplitzMatrix) +* [kangaroo](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/kangaroo) +* [addDigits](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/addDigits) +* [searchInsertPosition](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/searchInsertPosition) +* [exchangeSeats](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/exchangeSeats) +* [goatLatin](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/goatLatin) +* [findTheDifference](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findTheDifference) +* [integerReplacement](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/integerReplacement) +* [leafSimilarTrees](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/leafSimilarTrees) +* [selfDividingNumbers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/selfDividingNumbers) * [fiboModifiedCliq](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/fiboModifiedCliq) +* [rotateFunction](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/rotateFunction) * [stringSymmetry](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/stringSymmetry) +* [shuffleAnArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/shuffleAnArray) +* [bigCountries](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/bigCountries) +* [pascalTriangleII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/pascalTriangleII) +* [maximumProductSubArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maximumProductSubArray) * [missingElement](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/missingElement) +* [rotatedDigits](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/rotatedDigits) +* [longestSubstringWithoutRepeatingCharacters](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/longestSubstringWithoutRepeatingCharacters) +* [addStrings](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/addStrings) +* [pathSumIII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/pathSumIII) +* [secondHighestSalary](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/secondHighestSalary) * [twitt](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/twitt) +* [duplicateEmails](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/duplicateEmails) * [FrogJmp](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/FrogJmp) +* [partitionLabels](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/partitionLabels) +* [rotateArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/rotateArray) +* [removeDuplicatesSortedArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/removeDuplicatesSortedArray) +* [addTwoNumbersII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/addTwoNumbersII) +* [dailyTemperature](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/dailyTemperature) +* [rangeSumQueryMutable](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/rangeSumQueryMutable) +* [twoSumsII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/twoSumsII) +* [Apples&Oranges](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/Apples&Oranges) +* [combineTwoTables](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/combineTwoTables) +* [majorityElement](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/majorityElement) * [countDiv](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/countDiv) +* [implementStacksUsingQueue](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/implementStacksUsingQueue) +* [abbrevation](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/abbrevation) +* [lemonadeChange](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/lemonadeChange) * [fibonacci](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/fibonacci) +* [repeatedSubstringPattern](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/repeatedSubstringPattern) * [isBalancedTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/isBalancedTree) +* [minimumAbsoluteDifferenceInBST](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minimumAbsoluteDifferenceInBST) +* [dayOfTheProgrammer](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/dayOfTheProgrammer) +* [longPressedName](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/longPressedName) * [countFactors](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/countFactors) +* [validateStackSequences](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/validateStackSequences) * [maxProfitSlicing](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maxProfitSlicing) +* [reverseWordsInStringIII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/reverseWordsInStringIII) * [linkedListRemoveDuplicates](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/linkedListRemoveDuplicates) +* [miniMaxSum](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/miniMaxSum) +* [constructTheRectangle](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/constructTheRectangle) +* [employeeImportance](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/employeeImportance) * [stoneWall](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/stoneWall) +* [missingNumber](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/missingNumber) +* [naryTreePostOrderTraversal](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/naryTreePostOrderTraversal) * [triangleTriplet](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/triangleTriplet) +* [convertBSTtoGreaterTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/convertBSTtoGreaterTree) +* [missingNumbers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/missingNumbers) +* [addBinary](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/addBinary) +* [containsDuplicatesII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/containsDuplicatesII) +* [battleshipsInABoard](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/battleshipsInABoard) +* [detectCapital](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/detectCapital) +* [consecutiveNums](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/consecutiveNums) +* [kthSmallestElementInABst](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/kthSmallestElementInABst) +* [phraseSearch](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/phraseSearch) +* [gameOfTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/gameOfTree) +* [binaryTreePostOrderTraversal](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/binaryTreePostOrderTraversal) +* [uglyNumber](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/uglyNumber) +* [largestTimeFromDigits](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/largestTimeFromDigits) +* [longestWordDictionary](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/longestWordDictionary) +* [beautifulPairs](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/beautifulPairs) * [isBST](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/isBST) +* [kDiffPairsInAnArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/kDiffPairsInAnArray) +* [sumOfLeftLeafBinaryTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sumOfLeftLeafBinaryTree) * [permutationCheck](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/permutationCheck) +* [queueReconstructionByHeight](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/queueReconstructionByHeight) +* [maxConsecutiveOnes](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maxConsecutiveOnes) +* [compareVersionNumbers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/compareVersionNumbers) +* [countPrimes](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/countPrimes) +* [designCircularDeque](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/designCircularDeque) +* [wordPattern](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/wordPattern) * [zeroCollect](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/zeroCollect) +* [maximumProductOfThreeNumbers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maximumProductOfThreeNumbers) +* [bigSorting](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/bigSorting) +* [validPalindromeII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/validPalindromeII) +* [separateTheNumbers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/separateTheNumbers) +* [linkedListRandomNode](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/linkedListRandomNode) +* [xOfAKindInADeckOfCards](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/xOfAKindInADeckOfCards) +* [symmetricTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/symmetricTree) * [markAndToys](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/markAndToys) +* [camelCase](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/camelCase) +* [excelSheelColumnTitle](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/excelSheelColumnTitle) +* [sherklockAndBeast](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sherklockAndBeast) +* [binaryTreeZigZagLevelOrderTraversal](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/binaryTreeZigZagLevelOrderTraversal) +* [plusOne](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/plusOne) +* [largestPalindromeProduct](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/largestPalindromeProduct) +* [longestUncommonSubsequence](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/longestUncommonSubsequence) +* [subSets](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/subSets) +* [validMountainArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/validMountainArray) +* [nRepeatedElementIn2DArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/nRepeatedElementIn2DArray) +* [sortCharactersByFrequency](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sortCharactersByFrequency) +* [circularArrayRotation](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/circularArrayRotation) +* [buyAndSellStock1](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/buyAndSellStock1) +* [poorPigs](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/poorPigs) * [CrackCodeInt](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/CrackCodeInt) +* [betweenTwoSets](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/betweenTwoSets) +* [consecutiveSums](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/consecutiveSums) +* [trimBST](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/trimBST) +* [largestNumberTwiceOfOthers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/largestNumberTwiceOfOthers) +* [pangram](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/pangram) +* [validParentheses](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/validParentheses) +* [powerOf3](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/powerOf3) +* [sortArrayByParity](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sortArrayByParity) * [countingChocolate](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/countingChocolate) +* [palindromeLinkedList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/palindromeLinkedList) * [maxCounters](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maxCounters) * [maxSliceSum](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maxSliceSum) +* [sortedLinkedListToBst](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sortedLinkedListToBst) +* [powerOf4](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/powerOf4) * [frogJmpCounting](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/frogJmpCounting) +* [keypadCombination](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/keypadCombination) +* [findRelativeRanks](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findRelativeRanks) +* [binaryTreeTilt](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/binaryTreeTilt) +* [permutations](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/permutations) +* [removeLinkedListElements](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/removeLinkedListElements) +* [diameterOfBinaryTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/diameterOfBinaryTree) +* [customersWhoNeverOrder](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/customersWhoNeverOrder) +* [employeeEarningMoreThanTheirManagers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/employeeEarningMoreThanTheirManagers) +* [implementMagicDictionary](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/implementMagicDictionary) +* [gemStones](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/gemStones) +* [minimumDistanceBetweenBSTNodes](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minimumDistanceBetweenBSTNodes) +* [findPivotIndex](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findPivotIndex) +* [guessNumberHigherLower](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/guessNumberHigherLower) +* [fizzBuzz](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/fizzBuzz) * [primeComplexity](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/primeComplexity) * [fiboModified](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/fiboModified) -* [tieRope](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/tieRope) -* [twoSums](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/twoSums) -* [powerOf2](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/powerOf2) -* [iceCreamParlour-Hashtables](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/iceCreamParlour) -* [recursionDavisStaircase](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/recursionDavisStaircase) -* [bitManipulationLonelyInteger](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/bitManipulationLonelyInteger) -* [gradingStudents](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/gradingStudents) -* [emailAddressCreator](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/emailAddressCreator) -* [maxDisjointSetSum](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maxDisjointSetSum) -* [Apples&Oranges](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/Apples%26Oranges) -* [kangaroo](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/kangaroo) -* [lonelyInteger](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/lonelyInteger) -* [maximizingXor](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maximizingXor) -* [counterGame](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/counterGame) -* [bfsShortestReach](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/bfsShortestReach) -* [sherlockAndArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sherlockAndArray) -* [missingNumber](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/missingNumber) -* [camelCase](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/camelCase) -* [sumVsXor](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sumVsXor) -* [flippingBits](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/flippingBits) -* [hackerrankInString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/hackerRankInString) -* [caesarCipher](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/caesarCipher) -* [luckBalance](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/pangram) -* [sherlockNBeast](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/luckBalance) -* [beautifulPairs](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/beautifulPairs) -* [coursePlan](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/coursesOrder) -* [jimAndOrder](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/jimAndOrder) -* [phrasesearch](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/phraseSearch) -* [anagrams](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/anagram) -* [rectangleIntersection](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/rectangleIntersect) -* [keypadCombinations](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/keypadCombination) -* [superReducedString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/superReducedString) -* [strongPassword](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/strongPassword) * [marsExploration](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/marsExploration) -* [courseOrder](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/courseOrder) -* [migratingBirds](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/migratingBirds) -* [bonAppetit](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/bonAppetit) -* [closestNumbers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/closestNumbers) -* [gameOfThrones](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/gameOfThrones) +* [findLargestValueInEachTreeRow](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findLargestValueInEachTreeRow) * [twoStrings](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/twoStrings) -* [stringConstruction](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/stringConstruction) -* [sherlockAndValidString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sherlockAndValidString) -* [palindromeIndex](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/palindromeIndex) -* [perfectBinaryString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/perfectBinaryString) -* [loveLetterMysteryMakePalindrome](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/loveLetterMysteryMakePalindrome) -* [funnyString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/funnyString) -* [isPalindromeInteger](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/isPalindromeInteger) -* [removeDuplicatesSortedArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/removeDuplicatesSortedArray) -* [removeElement](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/removeElement) -* [reverseInteger](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/reverseInteger) -* [needleHayStack](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/needleHayStack) -* [romanToNumeral](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/romanToNumeral) -* [gemStones](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/gemStones) -* [alternateCharacters](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/alternateCharacters) -* [minMaxSum](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minMaxSum) -* [stairCase](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/stairCase) -* [lengthOfLastWord](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/lengthOfLastWord) -* [plusOne](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/plusOne) -* [addBinary](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/addBinary) -* [squareRoot](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/squareRoot) -* [climbStairs](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/climbStairs) -* [jewelAndStones](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/jewelAndStones) -* [setMismatch](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/setMismatch) -* [uniqueMorseCodeWords](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/uniqueMorseCodeWords) -* [nextGreaterElementI](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/nextGreaterElementI) -* [nextGreaterElementII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/nextGreaterElementII) -* [happyNumber](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/happyNumber) -* [uglyNumber](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/uglyNumber) -* [findTheDifference](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findTheDifference) -* [longestWordDictionary](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/longWordDictionary) -* [sumIntegerWithoutPlus](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sumIntegerWithoutPlus) -* [intersectionOfTwoArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/intersectionOfTwoArray) -* [intersectionOfTwoArrayII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/intersectionOfTwoArrayII) -* [constructStringFromBinaryTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/constructStringFromBinaryTree) -* [addTwoNumbersLinkedList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/addTwoNumbersLinkedList) -* [addStrings](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/addStrings) -* [maxHeightBst](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maxHeightBst) -* [minHeightBst](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minHeightBst) -* [sameTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sameTree) -* [intersectionOfTwoLinkedList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/intersectionOfTwoLinkedList) -* [powerOf2](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/powerOf2) -* [wordPattern](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/wordPattern) -* [isomorphicString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/isomorphicString) -* [firstUniqueCharacterInString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/firstUniqueCharacterInString) -* [sortCharactersByFrequency](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sortCharactersByFrequency) -* [guessNumberHigherLower](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/guessNumberHigherLower) -* [firstBadVersion](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/firstBadVersion) -* [searchInsertPosition](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/searchInsertPosition) -* [numberComplement](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/numberComplement) -* [longestContinuousIncreasingSequence](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/longestContinuousIncreasingSequence) -* [largestNumberTwiceOfOthers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/largestNumberTwiceOfOthers) -* [removeDuplicatesFromSortedList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/removeDuplicatesFromSortedList) -* [binaryWatch](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/binaryWatch) -* [reverseLinkedList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/reverseLinkedList) -* [numberOfSegmentsInAString](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/numberOfSegmentsInAString) -* [rotatedDigits](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/rotatedDigits) -* [twoSumsII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/twoSumsII) -* [majorityElement](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/majorityElement) -* [containsDuplicates](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/containsDuplicates) -* [containsDuplicatesII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/containsDuplicatesII) -* [reverseVowels](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/reverseVowels) -* [reverseStringII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/reverseStringII) -* [reverseWordsInStringIII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/reverseWordsInStringIII) -* [findPivotIndex](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findPivotIndex) -* [subArraySumEqualsK](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/subArraySumEqualsK) -* [poorPigs](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/poorPigs) -* [arrangingCoins](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/arrangingCoins) -* [sumOfSquareNumbers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sumOfSquareNumbers) -* [validPerfectSquare](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/validPerfectSquare) -* [encodeDecodeTinyUrl](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/encodeDecodeTinyUrl) -* [longestSubstringWithoutRepeatingCharacters](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/longestSubstringWithoutRepeatingCharacters) -* [maxConsecutiveOnes](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maxConsecutiveOnes) -* [goatLatin](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/goatLatin) -* [selfDividingNumbers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/selfDividingNumbers) -* [perfectNumber](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/perfectNumber) -* [validAnagram](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/validAnagram) -* [longestPalindrome](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/longestPalindrome) -* [tenthLine](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/tenthLine) -* [linkedListCycle](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/linkedListCycle) -* [canPlaceFlowers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/canPlaceFlowers) -* [teemoAttacking](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/teemoAttacking) -* [shortestUnsortedContinuousubarray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/shortestUnsortedContinuousubarray) +* [minimumIndexSumOfTwoList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minimumIndexSumOfTwoList) +* [distributeCandies](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/distributeCandies) +* [tieRope](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/tieRope) +* [sherklockAndArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/sherklockAndArray) +* [oddEvenLinkedList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/oddEvenLinkedList) +* [binaryTreePreOrderTraversal](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/binaryTreePreOrderTraversal) * [thirdMaximumNumber](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/thirdMaximumNumber) -* [beautifulDaysAtMovies](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/beautifulDaysAtMovies) -* [rotateArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/rotateArray) -* [rotateList](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/beautifulDaysAtMovies) -* [heaters](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/heaters) -* [minStack](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minStack) -* [separateTheNumbers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/separateTheNumbers) -* [saveThePrisoner](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/saveThePrisoner) -* [circularArrayRotation](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/circularArrayRotation) -* [longestCommonPrefix](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/longestCommonPrefix) -* [repeatedStringMatch](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/repeatedStringMatch) -* [compareVersionNumbers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/compareVersionNumbers) -* [deleteNode](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/deleteNode) -* [mergeSortedLists](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/mergeSortedLists) -* [removeLinkedListElements](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/removeLinkedListElements) -* [implementQueueUsingStacks](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/implementQueueUsingStacks) -* [implementStacksUsingQueue](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/implementStacksUsingQueue) -* [simplifyPath](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/simplifyPath) -* [minimumMovesToEqualArrayElements](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/minimumMovesToEqualArrayElements) -* [mergeSortedArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/mergeSortedArray) -* [searchRange](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/searchRange) -* [ransomNote](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/ransomNote) -* [132pattern](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/132pattern) +* [twoSums](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/twoSums) +* [strongPassword](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/strongPassword) * [balancedBinaryTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/balancedBinaryTree) -* [constructStringFromBinaryTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/constructStringFromBinaryTree) -* [nonDecreasingArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/nonDecreasingArray) -* [twoLists](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/twoLists) -* [strangeCounter](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/strangeCounter) -* [findAllNumbersDisappearedInAnArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findAllNumbersDisappearedInAnArray) -* [findAllDuplicatesInAnArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findAllDuplicatesInAnArray) -* [findSmallestLetterGreaterThanTarget](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findSmallestLetterGreaterThanTarget) -* [findPeakElement](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/findPeakElement) -* [licenseKeyFormatting](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/licenseKeyFormatting) -* [rotateFunction](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/rotateFunction) -* [partitionLabels](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/partitionLabels) -* [mergeIntervals](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/mergeIntervals) -* [almostSorted](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/almostSorted) -* [abbrevation](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/abbrevation) -* [validPalindrome](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/validPalindrome) -* [validPalindromeII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/validPalindromeII) -* [productExceptSelf](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/productExceptSelf) -* [maximumProductSubArray](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maximumProductSubArray) -* [maximumProductOfThreeNumbers](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maximumProductOfThreeNumbers) -* [houseRobber](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/houseRobber) -* [largestPermutation](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/largestPermutation) -* [NthDigit](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/NthDigit) -* [maxMin](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/maxMin) -* [betweenTwoSets](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/betweenTwoSets) -* [dayOfTheProgrammer](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/dayOfTheProgrammer) -* [divisibleSumPairs](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/divisibleSumPairs) -* [levelOrderTraversal](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/levelOrderTraversal) -* [levelOrderTraversalII](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/levelOrderTraversalII) -* [averageOfLevelsInBinaryTree](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/averageOfLevelsInBinaryTree) +* [powerOf2](https://github.com/Srinivas11789/AlgorithmNuggets/tree/master/ProblemSolving/powerOf2) ### WIP * Ruby From e946e8033cc65a66e9885aef0b87849da8b85965 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Sun, 6 Jan 2019 15:32:16 -0800 Subject: [PATCH 009/489] user interface helpers - terminal type gui in tk --- ui_ux/README.md | 5 +++++ ui_ux/terminal_in_tk.py | 13 +++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 ui_ux/README.md create mode 100644 ui_ux/terminal_in_tk.py diff --git a/ui_ux/README.md b/ui_ux/README.md new file mode 100644 index 0000000..c577cfa --- /dev/null +++ b/ui_ux/README.md @@ -0,0 +1,5 @@ +## User Interface + +* This folder is a reference to helper scripts or projects to build a better UI + + diff --git a/ui_ux/terminal_in_tk.py b/ui_ux/terminal_in_tk.py new file mode 100644 index 0000000..236de46 --- /dev/null +++ b/ui_ux/terminal_in_tk.py @@ -0,0 +1,13 @@ +# Reference: https://stackoverflow.com/questions/7253448/how-to-embed-a-terminal-in-a-tkinter-application + +from Tkinter import * +import os + +root = Tk() +termf = Frame(root, height=400, width=500) + +termf.pack(fill=BOTH, expand=YES) +wid = termf.winfo_id() +os.system('xterm -into %d -geometry 40x20 -sb &' % wid) + +root.mainloop() From 6c827d5092c81ec7c1e0a5b571b0c6f14cdb1475 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Mon, 10 Dec 2018 21:49:16 -0800 Subject: [PATCH 010/489] pending on this problem - alien dictionary - lexico confusion --- .../verifyingAlienDictionary/verify.py | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 ProblemSolving/verifyingAlienDictionary/verify.py diff --git a/ProblemSolving/verifyingAlienDictionary/verify.py b/ProblemSolving/verifyingAlienDictionary/verify.py new file mode 100644 index 0000000..becb3a3 --- /dev/null +++ b/ProblemSolving/verifyingAlienDictionary/verify.py @@ -0,0 +1,73 @@ +class Solution(object): + def isAlienSorted(self, words, order): + """ + :type words: List[str] + :type order: str + :rtype: bool + """ + + """ + # This logic is for each word to be lexicographic. the question asks you to do lexicographic of the words + result = True + # Brute force + for word in words: + temp = list(word) + prev = -1 + while temp: + for j in range(len(order)): + if order[j] == temp[0] and prev < j: + del temp[0] + prev = j + break + + if temp == []: + result = result and True + else: + result = result and False + return result + """ + + # 2 pointer method + + # Firstly, if there is a length decrease down the line (based on null logic), it would be a false + sort_by_len = sorted(words, key = len) + if sort_by_len == words: + return True + #else: + # return False + + # Secondly iterate by index for all the entries in the array (instead of iterating 2 by 2 or 3 by 3) + n = len(words) + indexes = [0]*n + + def sort_by_order(ch): + if ch == None: + return len(order) + return order.index(ch) + + maxi = len(sort_by_len[-1]) + for j in range(maxi): + for i in range(len(words)): + if j >= len(words[i]): + indexes[i] = None + else: + indexes[i] = words[i][j] + + if sorted(indexes,key=sort_by_order) == indexes: + continue + else: + print indexes + return False + return True + + """ + # List of lists logic may not work with this logic + # Sorted logic method + def sort_by_order(ch): + return order.index(ch) + + if sorted(words, key = sort_by_order) == words: + return True + else: + return False + """ From 6323729f30ed91ee9aeedaae6a10aab837e71bcd Mon Sep 17 00:00:00 2001 From: Srinivas Date: Sun, 6 Jan 2019 16:07:45 -0800 Subject: [PATCH 011/489] lt easy 100 pass - num of unique emails with rules --- ProblemSolving/numberOfUniqueEmails/num.py | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 ProblemSolving/numberOfUniqueEmails/num.py diff --git a/ProblemSolving/numberOfUniqueEmails/num.py b/ProblemSolving/numberOfUniqueEmails/num.py new file mode 100644 index 0000000..c525ec1 --- /dev/null +++ b/ProblemSolving/numberOfUniqueEmails/num.py @@ -0,0 +1,38 @@ +class Solution(object): + def numUniqueEmails(self, emails): + """ + :type emails: List[str] + :rtype: int + """ + + # Understanding + # * Split by @ to get ==> localname and domain name + # * "." => split by "." and join without it or replace "." by "" + # * "+" => split by "+" and take index 0 + # * last 2 rule only applies to localname + + # Iteration over the list + result = [] + for email in emails: + + # Identify names + localname, domainname = email.split("@") + + # Rule 1 about "." + if "." in localname: + localname = localname.replace(".","") + + # Rule 2 about "+" + if "+" in localname: + localname = localname.split("+")[0] + + filtered_email = localname+"@"+domainname + + if filtered_email not in result: + result.append(filtered_email) + + return len(result) + + + + From 820e8f3cbbc0e432d1e2eab11d58d7361ceb460c Mon Sep 17 00:00:00 2001 From: Srinivas Date: Sun, 6 Jan 2019 16:54:11 -0800 Subject: [PATCH 012/489] problem solve in golang - num of unique emails --- ProblemSolving/numberOfUniqueEmails/num.go | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 ProblemSolving/numberOfUniqueEmails/num.go diff --git a/ProblemSolving/numberOfUniqueEmails/num.go b/ProblemSolving/numberOfUniqueEmails/num.go new file mode 100644 index 0000000..2423322 --- /dev/null +++ b/ProblemSolving/numberOfUniqueEmails/num.go @@ -0,0 +1,37 @@ +func numUniqueEmails(emails []string) int { + + result := []string{} + + for _, email := range emails { + + // split local and domain name with "@" + e := strings.Split(email, "@") + localname, domainname := e[0], e[1] + + if strings.Contains(localname, ".") { + localname = strings.Replace(localname, ".", "", -1) + } + + if strings.Contains(localname, "+") { + localname = strings.Split(localname, "+")[0] + } + + // Debug + //fmt.Println(localname+"@"+domainname) + filtered_email := localname+"@"+domainname + + existence := 0 + for _, val := range result { + if val == filtered_email { + existence = 1 + } + } + + if existence == 0 { + result = append(result, filtered_email) + } + + } + + return len(result) +} From 2b7268e96b6e31d35bfc177f43eca8f930b6511d Mon Sep 17 00:00:00 2001 From: Srinivas Date: Sun, 6 Jan 2019 16:56:41 -0800 Subject: [PATCH 013/489] go lang problems init --- Go Lang/README.md | 4 ++ .../problemSolving/numberOfUniqueEmails.go | 37 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 Go Lang/README.md create mode 100644 Go Lang/problemSolving/numberOfUniqueEmails.go diff --git a/Go Lang/README.md b/Go Lang/README.md new file mode 100644 index 0000000..26d6f2c --- /dev/null +++ b/Go Lang/README.md @@ -0,0 +1,4 @@ +# Go Language Algorithms +* Basics - 101s +* ProblemSolving - started with golang problemsolving (dominant in python until now). Will maintian a redundancy here on problem solving in golang. Will move towards the main folder once more contributions are made. + diff --git a/Go Lang/problemSolving/numberOfUniqueEmails.go b/Go Lang/problemSolving/numberOfUniqueEmails.go new file mode 100644 index 0000000..2423322 --- /dev/null +++ b/Go Lang/problemSolving/numberOfUniqueEmails.go @@ -0,0 +1,37 @@ +func numUniqueEmails(emails []string) int { + + result := []string{} + + for _, email := range emails { + + // split local and domain name with "@" + e := strings.Split(email, "@") + localname, domainname := e[0], e[1] + + if strings.Contains(localname, ".") { + localname = strings.Replace(localname, ".", "", -1) + } + + if strings.Contains(localname, "+") { + localname = strings.Split(localname, "+")[0] + } + + // Debug + //fmt.Println(localname+"@"+domainname) + filtered_email := localname+"@"+domainname + + existence := 0 + for _, val := range result { + if val == filtered_email { + existence = 1 + } + } + + if existence == 0 { + result = append(result, filtered_email) + } + + } + + return len(result) +} From fd247c0e89b77d037201edefb9001e02591a3f49 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Mon, 7 Jan 2019 21:26:00 -0800 Subject: [PATCH 014/489] lt easy 100 pass - Nary Tree Pre Order Traversal --- .../iterative_recursive.py | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 ProblemSolving/naryTreePreOrderTraversal/iterative_recursive.py diff --git a/ProblemSolving/naryTreePreOrderTraversal/iterative_recursive.py b/ProblemSolving/naryTreePreOrderTraversal/iterative_recursive.py new file mode 100644 index 0000000..51c5516 --- /dev/null +++ b/ProblemSolving/naryTreePreOrderTraversal/iterative_recursive.py @@ -0,0 +1,66 @@ +""" +# Definition for a Node. +class Node(object): + def __init__(self, val, children): + self.val = val + self.children = children +""" +class Solution(object): + + def preorder(self, root): + """ + :type root: Node + :rtype: List[int] + """ + + # Iterative method of preorder traversal - 100 pass - 176ms + + # Stack to keep track of traversal + self.traverse_stack = [root] + + # Result + self.preorder = [] + + # Traverse until self.traverse_stack is empty + while self.traverse_stack: + # PreOrder - get the first node leftmost + current = self.traverse_stack.pop(0) + if current: + # Add to results + self.preorder.append(current.val) + # add children to the front of the array ==> preOrder + if current.children: + self.traverse_stack = current.children + self.traverse_stack + return self.preorder + + # Recursive Method ==> 100% pass - 180ms + """ + # Global list to hold the preorder nodes + self.preorder = [] + + # Recursive function + def traverse(node): + + # Node null check + if not node: + return + + # Append current node to list + self.preorder.append(node.val) + + # if node contains children, recurse all the children (left -> right) + if node.children: + for child in node.children: + traverse(child) + + # function call + traverse(root) + + return self.preorder + """ + + + + + + From 0f8edc6e1d71f42f3ac5d1df30978b96ecdf1d07 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Wed, 9 Jan 2019 19:27:18 -0800 Subject: [PATCH 015/489] univalued binary tree - lt easy 32 ms --- ProblemSolving/univalued_binary_tree/uni.py | 35 +++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 ProblemSolving/univalued_binary_tree/uni.py diff --git a/ProblemSolving/univalued_binary_tree/uni.py b/ProblemSolving/univalued_binary_tree/uni.py new file mode 100644 index 0000000..8d9a720 --- /dev/null +++ b/ProblemSolving/univalued_binary_tree/uni.py @@ -0,0 +1,35 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def isUnivalTree(self, root): + """ + :type root: TreeNode + :rtype: bool + """ + + self.uni_value = root.val + self.result = True + + # Recursive traverse + def traverse(node): + + if not node: + return + + if node.val != self.uni_value: + self.result = self.result and False + + if node.left: + traverse(node.left) + if node.right: + traverse(node.right) + + traverse(root) + return self.result + + From 6f9c00b737bb6c4e2d326952b641b5fe940be677 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Fri, 11 Jan 2019 03:41:32 -0800 Subject: [PATCH 016/489] lt easy - max depth of Nary tree --- ProblemSolving/maxHeightNaryTree/max.py | 34 +++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 ProblemSolving/maxHeightNaryTree/max.py diff --git a/ProblemSolving/maxHeightNaryTree/max.py b/ProblemSolving/maxHeightNaryTree/max.py new file mode 100644 index 0000000..6d89d0c --- /dev/null +++ b/ProblemSolving/maxHeightNaryTree/max.py @@ -0,0 +1,34 @@ +""" +# Definition for a Node. +class Node(object): + def __init__(self, val, children): + self.val = val + self.children = children +""" +class Solution(object): + def maxDepth(self, root): + """ + :type root: Node + :rtype: int + """ + + # Recursive Method of finding depth + def depth(node): + + # when a null node is reached from being recursive + if not node: + return 0 + else: + # Node is not None and Node has children (Children check) + # -- Go with maximum depth child as we progress + if node.children: + return 1 + max([depth(child) for child in node.children]) + else: + # When the node has no children count its position + return 1 + + # Root Node Null check + if not root: + return 0 + + return depth(root) From 0e2393b460457bd1a7ef617005032a201a39ccd0 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Fri, 11 Jan 2019 04:21:07 -0800 Subject: [PATCH 017/489] lt easy - nary tree depth recursive + iterative == 100% pass --- ProblemSolving/maxHeightNaryTree/max.py | 68 +++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/ProblemSolving/maxHeightNaryTree/max.py b/ProblemSolving/maxHeightNaryTree/max.py index 6d89d0c..36e415a 100644 --- a/ProblemSolving/maxHeightNaryTree/max.py +++ b/ProblemSolving/maxHeightNaryTree/max.py @@ -12,6 +12,7 @@ def maxDepth(self, root): :rtype: int """ + # Recursive Method of finding depth def depth(node): @@ -32,3 +33,70 @@ def depth(node): return 0 return depth(root) + + + """ + # Iterative method -- 100% pass + + # Fill in each level (BFS mode) as a list of levels of a tree + # -- The length of this (list of list/levels) will be the maximum depth + + # Null check + if not root: + return 0 + + # Traverse levels helper + stack = [[root]] + + # Levels list --- values at each level + levels = [] + + # Iterate until exhaust + while stack: + + # current level to traverse in list + current_level = stack.pop(0) + + # current levels values list + levels.append([]) + + # Next level list of children + next_level = [] + + # Exhaust current level list (all the current nodes) + while current_level: + # Remove node in each level (left to right) + current_node = current_level.pop(0) + + # Update the current node values list (always the last in the list for that level) + levels[-1].append(current_node.val) + + # Add all children to next level for traversing + if current_node.children: + next_level.extend(current_node.children) + + # If there are nodes to traverse in the next level + if next_level: + stack.append(next_level) + + #print levels + + # Depth + return len(levels) + """ + + """ + # Helpers/THoughts + i, n = 0, len(prev_level) + next_level = [] + while i < n: + current = prev_level[i] + if current.children: + stack.append([]) + for child in current.children: + stack[-1].append(child) + next_level.append(child.val) + i += 1 + stack.append(next_level) + """ + From 680b2037a61207ce3a0c74019e5dedc195264be6 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Sun, 13 Jan 2019 16:21:14 -0800 Subject: [PATCH 018/489] searching a binary search tree and return subtree from the searched element - lt easy 100 pass --- .../searchInBinarySearchTree/bst.py | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 ProblemSolving/searchInBinarySearchTree/bst.py diff --git a/ProblemSolving/searchInBinarySearchTree/bst.py b/ProblemSolving/searchInBinarySearchTree/bst.py new file mode 100644 index 0000000..a554e20 --- /dev/null +++ b/ProblemSolving/searchInBinarySearchTree/bst.py @@ -0,0 +1,94 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def searchBST(self, root, val): + """ + :type root: TreeNode + :type val: int + :rtype: TreeNode + """ + # 100 pass + # traverse level order using a list + stack = [root] + + # Bool to find a match + match = 0 + + # result tree + self.result = [] + + # Traverse by popping as we move + while stack: + # Current element from front of the list + current = stack.pop(0) + # Null check + if current: + # Match!, then update stack and match var + if current.val == val: + stack = [] + self.result = [] + match = 1 + + # If match happened then append to result + if match == 1: + self.result.append(current.val) + + # Traversing update for left and right of current node + stack.append(current.left) + stack.append(current.right) + else: + # Result expects addition of null for nodes that are null + self.result.append(None) + + # Eradicate nulls present at the end + while self.result and self.result[-1] == None: + self.result.pop() + + return self.result + + """ + # Expected answer in level order traversal + self.selected = None + self.subtree = [] + + # Recursive + def recurse(node): + + if not node: + #self.subtree.append(None) + return + + self.subtree.append(node.val) + + if node.val == val: + self.selected = node + + if not node.left and not node.right: + return + + if node.left: + recurse(node.left) + else: + self.subtree.append(None) + + if node.right: + recurse(node.right) + else: + self.subtree.append(None) + + recurse(root) + + if self.selected: + self.subtree = [] + recurse(self.selected) + return self.subtree + else: + return None + """ + + From 71445b3a02ff019c125e534fe2932d660a7e8354 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Sun, 13 Jan 2019 16:30:51 -0800 Subject: [PATCH 019/489] reverse only letters - lt easy 100 pass --- ProblemSolving/reverseOnlyLetters/rev.py | 27 ++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 ProblemSolving/reverseOnlyLetters/rev.py diff --git a/ProblemSolving/reverseOnlyLetters/rev.py b/ProblemSolving/reverseOnlyLetters/rev.py new file mode 100644 index 0000000..e6e7586 --- /dev/null +++ b/ProblemSolving/reverseOnlyLetters/rev.py @@ -0,0 +1,27 @@ +class Solution(object): + def reverseOnlyLetters(self, S): + """ + :type S: str + :rtype: str + """ + + # Logic: 100 pass 40 ms + # * Remove characters which are not alphabets from the string + # * Reverse the string + # * Place respective non-alphabet characters were they were before + + # result string + result = "" + + # Lets use isalpha to check for alphabets + only_letters = [i for i in S if i.isalpha()][::-1] + + # Run through the original name to find non alphabets and place them + for char in S: + if not char.isalpha(): + result += char + else: + result += only_letters.pop(0) + + return result + From d0775081206b5640641ea32038ff6e4f9e99e54b Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Mon, 14 Jan 2019 13:49:03 -0800 Subject: [PATCH 020/489] lt easy `k closest points to origin` - 100 pass --- .../kClosestPointsToOrigin/kclose.py | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 ProblemSolving/kClosestPointsToOrigin/kclose.py diff --git a/ProblemSolving/kClosestPointsToOrigin/kclose.py b/ProblemSolving/kClosestPointsToOrigin/kclose.py new file mode 100644 index 0000000..7879afc --- /dev/null +++ b/ProblemSolving/kClosestPointsToOrigin/kclose.py @@ -0,0 +1,58 @@ +class Solution(object): + def kClosest(self, points, K): + """ + :type points: List[List[int]] + :type K: int + :rtype: List[List[int]] + """ + + # 100 pass 976ms + # * A bit lousy logic with a number of datastructure or memory + + # Euclidean distance: Recollecting math... + # * Use Pythagoras Theorem (for a triangle - right angle) + # * Right Angle Triangle has 3 sides --> slanting (diagnal) + horizontal + vertical + # * Diagnal^2 = horizontal_line^2 + vertival_line^2 + # * Diagnal = sqrt(horizontal_line^2 + vertival_line^2) + # * Diagnal = sqrt([x2-x1]^2 + [y2-y1]^2) + # - x1,y1 and x2, y2 are the points connecting the diagnal + + import math # To calc square root + + # Initial point is always the origin (based on the question) + first_point = [0,0] + + # Dictionary to manage the distance vs the points + distances = {} + + # Iterate the next points from given list + for second_point in points: + # Get the x distance from origin + x_dist = first_point[0]-second_point[0] + # Y distance from origin + y_dist = first_point[1]-second_point[1] + # Euc distance calculation + euc_dist = math.sqrt(x_dist**2 + y_dist**2) + # Add relationship between second_point and respective euc_distances in dictionary + if euc_dist not in distances: + distances[euc_dist] = [] + # if More than one value having same euc_distance, so use list + distances[euc_dist].append(second_point) + + # Result list + result = [] + + # Arrange distances to origin is ascending order + closest_to_origin = sorted(distances.keys()) + + # Iterate until we get K elements + while len(result) < K: + # Get first entry from sorted distances + current_closest = closest_to_origin.pop(0) + + # Handle more than one second point having same euc distance + # * Append second points until the result length is less than K + while distances[current_closest] and len(result) < K: + result.append(distances[current_closest].pop(0)) + + return result From 80e75eddc444cdfa02b6087cb5211e3fb7eb016d Mon Sep 17 00:00:00 2001 From: Srinivas Date: Thu, 17 Jan 2019 19:01:13 -0800 Subject: [PATCH 021/489] :bridge_at_night: reorder log files lt easy --- ProblemSolving/reorder_log_files/reorder.py | 99 +++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 ProblemSolving/reorder_log_files/reorder.py diff --git a/ProblemSolving/reorder_log_files/reorder.py b/ProblemSolving/reorder_log_files/reorder.py new file mode 100644 index 0000000..5eccbeb --- /dev/null +++ b/ProblemSolving/reorder_log_files/reorder.py @@ -0,0 +1,99 @@ +class Solution(object): + # 100 pass logic with the tie checker implemented + def reorderLogFiles(self, logs): + """ + :type logs: List[str] + :rtype: List[str] + """ + + # A log ==> "yy xx xx xx" + # yy == id + # xx xx xx == log + + # Dictionary to hold all the entries + # * Digit, store as list to maintain the order + # * Letters, store as dictionary of id as value, so it is easy to sort the logs vs ids + dictionary = { + "letter":{}, + "digit":[] + } + + # Result list + result = [] + + # iterate through the logs to fill the dictionary + # * Digit logs - store with index + # * Letter logs - store only identifier as keys + + for log in logs: + current_log = log.split(" ") + # Digit logic - if log contains digit + if ("".join(current_log[1:])).isdigit(): + dictionary["digit"].append(log) + else: + # Store logs as key and id as value + # Tie checker + if " ".join(current_log[1:]) not in dictionary["letter"]: + dictionary["letter"][" ".join(current_log[1:])] = current_log[0] + else: + # Tie occurred + dictionary["letter"][" ".join(current_log[1:])] = [dictionary["letter"][" ".join(current_log[1:])]] + dictionary["letter"][" ".join(current_log[1:])].append(current_log[0]) + + # lexi sort the letter logs without ids + letter_logs = sorted(dictionary["letter"].keys()) + + # Logic works without the underlying block - this block checks sorting in the case of a tie and sorts + # Append letter logs + for letter in letter_logs: + # Handle tie condition + if type(dictionary["letter"][letter]) is list: + identifiers = sorted(dictionary["letter"][letter]) + for i in identifiers: + result.append(i+" "+letter) + + else: + result.append(dictionary["letter"][letter]+" "+letter) + + # Append the digit logs in the same order + result.extend(dictionary["digit"]) + + return result + + # Another Logic ---> + # This logic is 100 pass for this problem without the tie checker implemented.... + def reorderLogFilesWithoutTieCheck(self, logs): + """ + :type logs: List[str] + :rtype: List[str] + """ + + # Dictionary to hold all the entries + dictionary = { + "letter":{}, + "digit":[] + } + + result = [] + + # iterate through the logs to fill the dictionary + # * Digit logs - store with index + # * Letter logs - store only identifier as keys + + for log in logs: + current_log = log.split(" ") + # Digit logic + if ("".join(current_log[1:])).isdigit(): + dictionary["digit"].append(log) + else: + dictionary["letter"][" ".join(current_log[1:])] = current_log[0] + + # lexi sort + letter_logs = sorted(dictionary["letter"].keys()) + + for letter in letter_logs: + result.append(dictionary["letter"][letter]+" "+letter) + + result.extend(dictionary["digit"]) + + return result From 0d41f65e3dc9f575932fb68ebdb6564b15c969b8 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Sun, 20 Jan 2019 13:40:17 -0800 Subject: [PATCH 022/489] fizzBuzz update --- ProblemSolving/fizzBuzz/fizz.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ProblemSolving/fizzBuzz/fizz.py b/ProblemSolving/fizzBuzz/fizz.py index 5b6d19c..9aadce9 100644 --- a/ProblemSolving/fizzBuzz/fizz.py +++ b/ProblemSolving/fizzBuzz/fizz.py @@ -17,4 +17,28 @@ def fizzBuzz(self, n): result.append(str(i)) return result +# Alternate Logic +""" +class Solution(object): + def fizzBuzz(self, n): + """ + :type n: int + :rtype: List[str] + """ + + result = [] + for i in range(1,n+1): + current = "" + # Divisible by 3 + if i%3 == 0: + current += "Fizz" + # Divisible by 5 + if i%5 == 0: + current += "Buzz" + # Not visible by Both + if not current: + current = str(i) + result.append(current) + return result +""" From 08cd91dba7f3d549c528966380d862da5d68cab6 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Sun, 20 Jan 2019 21:10:36 -0800 Subject: [PATCH 023/489] shortest completing word - lt easy 100 pass --- .../shortestCompletingWord/short.py | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 ProblemSolving/shortestCompletingWord/short.py diff --git a/ProblemSolving/shortestCompletingWord/short.py b/ProblemSolving/shortestCompletingWord/short.py new file mode 100644 index 0000000..da6df9b --- /dev/null +++ b/ProblemSolving/shortestCompletingWord/short.py @@ -0,0 +1,86 @@ +class Solution(object): + def shortestCompletingWord(self, licensePlate, words): + """ + :type licensePlate: str + :type words: List[str] + :rtype: str + """ + + # Logic 3: + # * Dictionary compare + + import collections + + license = collections.Counter([str(i.lower()) for i in licensePlate if not i.isdigit() and i != " "]) + result = "" + + for word in words: + word_count = collections.Counter(word.lower()) + decide = 0 + for character in license.keys(): + if character not in word_count or license[character] > word_count[character]: + decide = 1 + #print character, license[character], word_count[character], decide + if decide == 0: + if result == "": + result = word + else: + if len(word) < len(result): + result = word + return result + + # Logic 2: Sorted Match Logic: But fails when the characters not present in one of the string sort becomes wrong + """ + # Sanitize licensePlate + # * Lowercase + # * not digit + # * sorted order to match + license = str("".join(sorted([str(char.lower()) for char in licensePlate if not char.isdigit() and char != " "]))) + + result = "" + + # iterate through words for a substring match + for word in words: + current = str("".join(sorted(word.lower()))) + if license in current: + if result == "": + result = word + else: + if len(word) < len(result): + result = word + return result + """ + + # Logic1: O(NM) - to iterate on both licenseplate and words + # * One full iteration of the array to find the minimum length that contains all the letters + #### CRAP............ + """ + result = [] + result_mini = "" + + # Iterate the words + for word in words: + + # Lowercase the word as per instructons + current = list(word.lower()) + temp = list(licensePlate.lower()) + + # Iterate licensePlate to match all characters of the word + for i in range(len(temp)): + for j in range(len(current)): + if not temp[i].isdigit() and temp[i] == current[j]: + if (i, j) not in result: + result.append((i,j)) + + # LicensePlate match + if not temp: + if result_mini == "": + result_mini = len(current) + else: + result_mini = min(result_mini, len(current)) + + return result_mini + """ + + + From 91d8351f1118d5fb43e59c6ebe3ae030fff6aae9 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Mon, 21 Jan 2019 03:12:10 -0800 Subject: [PATCH 024/489] evenOddArrange problem without extra space --- ProblemSolving/evenOddArrangement/even.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 ProblemSolving/evenOddArrangement/even.py diff --git a/ProblemSolving/evenOddArrangement/even.py b/ProblemSolving/evenOddArrangement/even.py new file mode 100644 index 0000000..3d6324c --- /dev/null +++ b/ProblemSolving/evenOddArrangement/even.py @@ -0,0 +1,18 @@ +# Even to the front of the array and Odd behind the array - with no extra space, operate in the given array +def evenOddArrange(arr): + odd_index = None + for i in range(len(arr)): + if arr[i]%2 == 0: + if odd_index != None: + arr[odd_index], arr[i] = arr[i], arr[odd_index] + odd_index += 1 + else: + if odd_index == None: + odd_index = i + return arr + +def main(): + array = [1,2,3,4,5,6,7,8,9] + print evenOddArrange(array) + +main() From 40ff90003f7fc61f8715c3a3a8b2f53135b6f14e Mon Sep 17 00:00:00 2001 From: Srinivas Date: Tue, 22 Jan 2019 21:48:00 -0800 Subject: [PATCH 025/489] :bridge_at_night: distribute coins in a binary tree - lt medium --- .../distributeCoinsInBinaryTree/dist.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 ProblemSolving/distributeCoinsInBinaryTree/dist.py diff --git a/ProblemSolving/distributeCoinsInBinaryTree/dist.py b/ProblemSolving/distributeCoinsInBinaryTree/dist.py new file mode 100644 index 0000000..490fcd8 --- /dev/null +++ b/ProblemSolving/distributeCoinsInBinaryTree/dist.py @@ -0,0 +1,44 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def distributeCoins(self, root): + """ + :type root: TreeNode + :rtype: int + """ + + # Reference from lee215 at https://leetcode.com/problems/distribute-coins-in-binary-tree/discuss/221930/JavaC%2B%2BPython-Recursive-Solution + + # DFS method to find the distance to the root from both the left and right subtree + + # Global result + self.result = 0 + + # DFS recursive method + def dfs(node): + + # Null node check + if not node: + return 0 + + # Left and Right values + left = dfs(node.left) + right = dfs(node.right) + + # Add left and right values as we progress to the parent to the result + self.result += abs(left) + abs(right) + + # For each node, return everything except 1 for itself + return node.val + left + right - 1 + + # recursive call + dfs(root) + + return self.result + + From ab377d9b23a1bc06d66f30c03924fd087a150764 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Wed, 23 Jan 2019 15:53:45 -0800 Subject: [PATCH 026/489] update largestTimeFromDigits - fixed --- ProblemSolving/largestTimeFromDigits/large.py | 84 ++++++++++++++++++- 1 file changed, 80 insertions(+), 4 deletions(-) diff --git a/ProblemSolving/largestTimeFromDigits/large.py b/ProblemSolving/largestTimeFromDigits/large.py index e7db1d4..fbc6976 100644 --- a/ProblemSolving/largestTimeFromDigits/large.py +++ b/ProblemSolving/largestTimeFromDigits/large.py @@ -4,7 +4,86 @@ def largestTimeFromDigits(self, A): :type A: List[int] :rtype: str """ + # Logic: I was using permutations from before, but happened to try to reduce the num of iterations + # * This logic would iterate through the full permutation list everytime + # * Reference: https://leetcode.com/problems/largest-time-for-given-digits/discuss/211540/Python-simple-obvious-solution + # Get all permutations as usual, store in reverse order to get max hour and corresponding minute + import itertools + all_perm = sorted([i for i in itertools.permutations(A, r=4)], reverse=True) + + # Iterate through all permutations + for perm in all_perm: + + # Max hour being first 2 and corresponding minute being the last 2 + hour = str(perm[0])+str(perm[1]) + minute = str(perm[2])+str(perm[3]) + + # Check for aprropriate hour and minute + if int(hour) < 24 and int(minute) < 60: + return hour+":"+minute + + # Return for null cases + return "" + + """ + # Convert list to dictionary for faster lookup + import collections + As = collections.Counter(A) + + time = "" + + # To find the max hours, Iterating backwards for max hours + for i in range(23,-1,-1): + if len(str(i)) == 1: + i = str("0")+str(i) + else: + i = str(i) + # Hour found + if int(i[0]) in As and int(i[1]) in As: + print i, As + if (i[0] == i[1] and As[int(i[0])] > 1) or i[0] != i[1]: + time = i + if As[int(i[0])] > 1: + As[int(i[0])] -= 1 + else: + del As[int(i[0])] + if As[int(i[1])] > 1: + As[int(i[1])] -= 1 + else: + del As[int(i[1])] + break + + + if time == "": + return "" + + print time, As + time += ":" + minute = As.keys() + + if len(minute) == 1: + minute = str(minute[0])*2 + if int(minute) > 59: + return "" + time += minute + else: + minute = max(int(str(minute[0])+str(minute[1])), int(str(minute[1])+str(minute[0]))) + if minute > 59: + minute = str(minute)[::-1] + if int(minute) > 59: + return "" + time += str(minute) + + return time + """ + +""" +class Solution(object): + def largestTimeFromDigits(self, A): + # :type A: List[int] + # :rtype: str + # From the given array # * Get all the 2 digit number arranged in the descending order # * Highest delta from 24 would be the maximum hour @@ -27,9 +106,6 @@ def largestTimeFromDigits(self, A): hmax = i hmax = - - - """ # Single loop logic - try it import itertools max_hour = 24 @@ -56,6 +132,6 @@ def largestTimeFromDigits(self, A): return str(hmax)+":"+str(Mmax) else: return "" - """ +""" From 34d571335b641f181ed4c490ce1c9b32866e6964 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Thu, 24 Jan 2019 07:26:07 -0800 Subject: [PATCH 027/489] :city_sunrise: powerful integers - lt easy - 100 pass --- ProblemSolving/powerfulIntegers/power.py | 34 ++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 ProblemSolving/powerfulIntegers/power.py diff --git a/ProblemSolving/powerfulIntegers/power.py b/ProblemSolving/powerfulIntegers/power.py new file mode 100644 index 0000000..750b2d1 --- /dev/null +++ b/ProblemSolving/powerfulIntegers/power.py @@ -0,0 +1,34 @@ +class Solution(object): + def powerfulIntegers(self, x, y, bound): + """ + :type x: int + :type y: int + :type bound: int + :rtype: List[int] + """ + + # Logic 1: Brute force with 2 for loops O(N**2) + + result = [] + + # Iterate all i and j values + for i in range(0,bound): + for j in range(0, bound): + + # Calculate powerful integer + powerful = x**i + y**j + + # Debug + #print powerful,i, j + + # Result append only when result < bound, else break and increment i + if powerful <= bound: + result.append(powerful) + else: + break + + # When power of i itself causes to exceed bound stop. + if j == 0 and powerful > bound: + break + + return list(set(result)) From 2ba9816663e59084ff09b49eb7829e28ebae76d5 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Fri, 25 Jan 2019 03:58:04 -0800 Subject: [PATCH 028/489] binary search again --- ProblemSolving/binarySearch/concept.py | 47 ++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 ProblemSolving/binarySearch/concept.py diff --git a/ProblemSolving/binarySearch/concept.py b/ProblemSolving/binarySearch/concept.py new file mode 100644 index 0000000..a4081cb --- /dev/null +++ b/ProblemSolving/binarySearch/concept.py @@ -0,0 +1,47 @@ +# Binary Search + +# Recursive +def binary_search(array, target, start_index): + + n = len(array) + mid = n//2 + + if n == 0: + return "Not Found!" + + #print start_index, mid, target, array + + if array[mid] == target: + return "Found! at " + str(mid + start_index) + elif array[mid] > target: + if start_index > 0: + return binary_search(array[:mid], target, start_index) + else: + return binary_search(array[:mid], target, 0) + else: + return binary_search(array[mid+1:], target, start_index+mid+1) + +# 2 pointer +def binary_search2(array, target): + + # Initial values + left = 0 + right = len(array) + + # Iterate until left < right + while left < right: + # Mid point + mid = (left + right)//2 + #print left, right, mid, array + if array[mid] == target: + return "Found! at " + str(mid) + elif array[mid] > target: + right = mid + else: + left = mid+1 + return "Not Found!" + +array = [1,2,3,4,5,6,7,8,9] +print binary_search(array, 1, 0), binary_search(array, 9, 0), binary_search(array, 10, 0) +print binary_search2(array, 1), binary_search2(array, 9), binary_search2(array, 10) + From 70c8d1663aacb2fb4bfb3eabe0d4dae9615cfdb3 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Fri, 25 Jan 2019 15:46:12 -0800 Subject: [PATCH 029/489] range sum of bst - 100 pass lt medium --- ProblemSolving/rangeSumOfBst/range.py | 55 +++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 ProblemSolving/rangeSumOfBst/range.py diff --git a/ProblemSolving/rangeSumOfBst/range.py b/ProblemSolving/rangeSumOfBst/range.py new file mode 100644 index 0000000..98ec664 --- /dev/null +++ b/ProblemSolving/rangeSumOfBst/range.py @@ -0,0 +1,55 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def rangeSumBST(self, root, L, R): + """ + :type root: TreeNode + :type L: int + :type R: int + :rtype: int + """ + + # Null check + if not root: + return 0 + + # global sum + self.sum = 0 + + # Brute force - traverse all nodes to look at their value + def traverse(node): + + if node.val >= L and node.val <= R: + self.sum += node.val + + if node.left: + traverse(node.left) + + if node.right: + traverse(node.right) + + # Function utilizing BST property - a little faster (avoiding unwanted traversals) + def traverse2(node): + + print node.val + + if node.val >= L and node.val <= R: + self.sum += node.val + + # Traverse left only when node value is greater than Left + if node.val > L and node.left: + traverse(node.left) + + if node.val < R and node.right: + traverse(node.right) + + + traverse2(root) + + return self.sum + From 5dfc0245ae00c174343f152d8faed1ad4edcb8f4 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Fri, 25 Jan 2019 19:23:57 -0800 Subject: [PATCH 030/489] :city_sunset: maximum binary tree - lt medium 100 pass --- ProblemSolving/maximumBinaryTree/maxi.py | 162 +++++++++--------- .../maximumBinaryTree/other_logic_pending.py | 105 ++++++++++++ 2 files changed, 185 insertions(+), 82 deletions(-) create mode 100644 ProblemSolving/maximumBinaryTree/other_logic_pending.py diff --git a/ProblemSolving/maximumBinaryTree/maxi.py b/ProblemSolving/maximumBinaryTree/maxi.py index 17442c0..c664bcc 100644 --- a/ProblemSolving/maximumBinaryTree/maxi.py +++ b/ProblemSolving/maximumBinaryTree/maxi.py @@ -1,5 +1,3 @@ -#### Pending... - # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): @@ -14,92 +12,92 @@ def constructMaximumBinaryTree(self, nums): :rtype: TreeNode """ - # Finding the root - root = max(nums) - rootIndex = nums.index(root) - - # Create a tree - rootNode = TreeNode(root) - - # Left and the Right Subarray - left = nums[:rootIndex] - right = nums[rootIndex+1:] + # Recursive method + def recurse(array): + + if not array: + return + + # Select maximum and compute left and right subtree + maxi = max(array) + maxi_ind = array.index(maxi) + left = array[:maxi_ind] + right = array[maxi_ind+1:] + + # Create a node + node = TreeNode(maxi) + + # Add left and right to each node + node.left = recurse(left) + node.right = recurse(right) + + # return node so the tree is build as we recurse + return node - # First left and the right node - if len(left) >= 1: - rootNode.left = TreeNode(max(left)) - leftTree = rootNode.left - if len(right) >= 1: - rootNode.right = TreeNode(max(right)) - rightTree = rootNode.right + # Iterative method + # * the list persistence (left,right) could have been done better. The indexes get corrupted between array, left, right hence stored the node with the corresponding next array to operate + def iterative(array): + + # Select maximum and create root + maxi = max(array) + root = TreeNode(maxi) - count = len(left)-1 - while count > 0: - maxi = left.index(leftTree.val) - l = left[:maxi] - r = left[maxi+1:] - left.pop(maxi) - if len(l) >= 1: - leftTree.left = TreeNode(max(l)) - leftTree = leftTree.left - count -= 1 - if len(r) >= 1: - leftTree.right = TreeNode(max(r)) - leftTree = leftTree.right - count -= 1 + # Stack to track the traversal - Storing the node with the corresponding array to operate next. + # * Find some way to persist array, indexes across iteration + stack = [(root, array)] + + # Iterate through all the nodes + while stack: + # pop 0 as per breath first traversal + current = stack.pop(0) + # Extract the node and corresponding array + current_node = current[0] + array = current[1] + + # Debug + #print current_node.val, array + + # Maximum index and left and right sub array + index = array.index(current_node.val) + left = array[:index] + right = array[index+1:] + + # Operate on left + # * Create node, Add left node and then to stack to continue traversal + if left: + left_node = TreeNode(max(left)) + current_node.left = left_node + stack.append((left_node, left)) + + # Operate on right + # * Create node, Add right node and then to stack to continue traversal + if right: + right_node = TreeNode(max(right)) + current_node.right = right_node + stack.append((right_node, right)) + + return root - count = len(right)-1 - while count > 0: - maxi = right.index(rightTree.val) - l = right[:maxi] - r = right[maxi+1:] - right.pop(maxi) - if len(l) >= 1: - rightTree.left = TreeNode(max(l)) - rightTree = rightTree.left - count -= 1 - if len(r) >= 1: - rightTree.right = TreeNode(max(r)) - rightTree = rightTree.right - count -= 1 - - return rootNode - """ - # This logic is with respect to a bst - problem statement works on the maximum element - - # Left and the Right Subtree split - left = sorted(nums[:rootIndex], reverse=True) - right = sorted(nums[rootIndex+1:],reverse=True) - - # First left and the right node - if len(left) >= 1: - rootNode.left = TreeNode(left[0]) - leftTree = rootNode.left - if len(right) >= 1: - rootNode.right = TreeNode(right[0]) - rightTree = rootNode.right + # Recursive Solution + # Function call and return + root = recurse(nums) + return root - if len(left[1:]) > 1: - # Iterate to fill in every node - for num in left[1:]: - if num > leftTree.val: - leftTree.left = TreeNode(num) - leftTree = leftTree.left - else: - leftTree.right = TreeNode(num) - leftTree = leftTree.right + # Iterative solution + #return iterative(nums) - if len(right[1:]) >= 1: - for num in right[1:]: - if num < rightTree.val: - rightTree.left = TreeNode(num) - rightTree = rightTree.left - else: - rightTree.right = TreeNode(num) - rightTree = rightTree.right - return rootNode - """ + """ + # Plain thinking + maxi = max(nums) + root_index = nums.index(maxi) + root = TreeNode(nums[root_index]) + left = nums[:root_index] + right = nums[root_index+1:] + while left: + maxi = max(left) + """ + diff --git a/ProblemSolving/maximumBinaryTree/other_logic_pending.py b/ProblemSolving/maximumBinaryTree/other_logic_pending.py new file mode 100644 index 0000000..17442c0 --- /dev/null +++ b/ProblemSolving/maximumBinaryTree/other_logic_pending.py @@ -0,0 +1,105 @@ +#### Pending... + +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def constructMaximumBinaryTree(self, nums): + """ + :type nums: List[int] + :rtype: TreeNode + """ + + # Finding the root + root = max(nums) + rootIndex = nums.index(root) + + # Create a tree + rootNode = TreeNode(root) + + # Left and the Right Subarray + left = nums[:rootIndex] + right = nums[rootIndex+1:] + + # First left and the right node + if len(left) >= 1: + rootNode.left = TreeNode(max(left)) + leftTree = rootNode.left + if len(right) >= 1: + rootNode.right = TreeNode(max(right)) + rightTree = rootNode.right + + count = len(left)-1 + while count > 0: + maxi = left.index(leftTree.val) + l = left[:maxi] + r = left[maxi+1:] + left.pop(maxi) + if len(l) >= 1: + leftTree.left = TreeNode(max(l)) + leftTree = leftTree.left + count -= 1 + if len(r) >= 1: + leftTree.right = TreeNode(max(r)) + leftTree = leftTree.right + count -= 1 + + + count = len(right)-1 + while count > 0: + maxi = right.index(rightTree.val) + l = right[:maxi] + r = right[maxi+1:] + right.pop(maxi) + if len(l) >= 1: + rightTree.left = TreeNode(max(l)) + rightTree = rightTree.left + count -= 1 + if len(r) >= 1: + rightTree.right = TreeNode(max(r)) + rightTree = rightTree.right + count -= 1 + + return rootNode + """ + # This logic is with respect to a bst - problem statement works on the maximum element + + # Left and the Right Subtree split + left = sorted(nums[:rootIndex], reverse=True) + right = sorted(nums[rootIndex+1:],reverse=True) + + # First left and the right node + if len(left) >= 1: + rootNode.left = TreeNode(left[0]) + leftTree = rootNode.left + if len(right) >= 1: + rootNode.right = TreeNode(right[0]) + rightTree = rootNode.right + + if len(left[1:]) > 1: + # Iterate to fill in every node + for num in left[1:]: + if num > leftTree.val: + leftTree.left = TreeNode(num) + leftTree = leftTree.left + else: + leftTree.right = TreeNode(num) + leftTree = leftTree.right + + if len(right[1:]) >= 1: + for num in right[1:]: + if num < rightTree.val: + rightTree.left = TreeNode(num) + rightTree = rightTree.left + else: + rightTree.right = TreeNode(num) + rightTree = rightTree.right + + return rootNode + """ + + From 35485c943636186d620e483f8ae807a752aee968 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Fri, 25 Jan 2019 22:16:10 -0800 Subject: [PATCH 031/489] :bridge_at_night: binary tree insert - lt medium 100 pass --- .../insertIntoBinarySearchTree/insert.py | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 ProblemSolving/insertIntoBinarySearchTree/insert.py diff --git a/ProblemSolving/insertIntoBinarySearchTree/insert.py b/ProblemSolving/insertIntoBinarySearchTree/insert.py new file mode 100644 index 0000000..a5c9d33 --- /dev/null +++ b/ProblemSolving/insertIntoBinarySearchTree/insert.py @@ -0,0 +1,65 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def insertIntoBST(self, root, val): + """ + :type root: TreeNode + :type val: int + :rtype: TreeNode + """ + + # Recursive Solution - Insert a Node + def recurse_insert(node, val): + + # Null node + if not node: + return + + # Guaranteed the node wont exist already so check for only smaller or greater than + # * Left - recurse for left node existence + # * else, add the left node + if val < node.val: + if node.left: + recurse_insert(node.left, val) + else: + node.left = TreeNode(val) + else: + # * Right - recurse for right node existence + # * else, add the right node + if node.right: + recurse_insert(node.right, val) + else: + node.right = TreeNode(val) + + def iterative_insert(node, val): + + # stack to traverse + stack = [node] + + while stack: + current_node = stack.pop(0) + + # Left and Right traverse + if val < current_node.val: + if current_node.left: + stack.append(current_node.left) + else: + current_node.left = TreeNode(val) + return + else: + if current_node.right: + stack.append(current_node.right) + else: + current_node.right = TreeNode(val) + return + + # Function call + recurse_insert(root, val) + #iterative_insert(root, val) + return root + From 14fc243d4bf70247c8bc719ba1b537f37da12596 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Sun, 27 Jan 2019 11:20:53 -0800 Subject: [PATCH 032/489] :city_sunrise: graph day - all paths to target - 100 pass lt medium --- .../allPathsFromSourceToTargetGraph/all.py | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 ProblemSolving/allPathsFromSourceToTargetGraph/all.py diff --git a/ProblemSolving/allPathsFromSourceToTargetGraph/all.py b/ProblemSolving/allPathsFromSourceToTargetGraph/all.py new file mode 100644 index 0000000..14237a4 --- /dev/null +++ b/ProblemSolving/allPathsFromSourceToTargetGraph/all.py @@ -0,0 +1,61 @@ +class Solution(object): + def allPathsSourceTarget(self, graph): + """ + :type graph: List[List[int]] + :rtype: List[List[int]] + """ + # Given + # * Index is the node + # * graph[Index] is the next nodes of the index node + + # There are 2 method for a graph (like in a tree), + # * DFS - Depth ==> recursive strategy + # * BFS - Breath ==> Iterative strategy + + # Common setting + # Num of nodes (as each i is a node) + n = len(graph) + + # Method 1 - 100 pass 100% faster + + # DFS - Recusive method, a method defined for recursing + + def traverse_graph(path): + + # As we progress with path, the last node in path is the latest node: path[-1] + + # When n-1 or last node is reached, add the path to result + if path[-1] == n-1: + result.append(path) + + # For each next node, add next_node to path and recurse. + for next_node in graph[path[-1]]: + traverse_graph(path+[next_node]) + + # Method 2 - 100 pass, 50% faster + # BFS - Iterative method, a method with a reference list (stack) defined for iteration + + def traverse_graph2(): + + # Reference stack with known first node + stack = [[0]] + + # When stack is empty all nodes are traversed + while stack: + # Current path from stack, current node should be the lastest in the last of path + current_path = stack.pop(0) + current_node = current_path[-1] # Latest Node in the path + + # Once, final node is reached append path + if current_node == n-1: + result.append(current_path) + + # Add next nodes in path and into the stack + if graph[current_node]: + for next_node in graph[current_node]: + stack.append(current_path+[next_node]) + + result = [] + traverse_graph([0]) + #traverse_graph2() + return result From 29e0d106cf8daa01aa17f8a90ef7a20018181460 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Sun, 27 Jan 2019 15:37:35 -0800 Subject: [PATCH 033/489] :city_sunset: string with no AAAs or BBBs - lt easy 100 pass (Little longer for an easy problem - try a different approach) - pending --- ProblemSolving/stringWithout3AsOr3Bs/str.py | 103 ++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 ProblemSolving/stringWithout3AsOr3Bs/str.py diff --git a/ProblemSolving/stringWithout3AsOr3Bs/str.py b/ProblemSolving/stringWithout3AsOr3Bs/str.py new file mode 100644 index 0000000..bf2b91d --- /dev/null +++ b/ProblemSolving/stringWithout3AsOr3Bs/str.py @@ -0,0 +1,103 @@ +class Solution(object): + def strWithout3a3b(self, A, B): + """ + :type A: int + :type B: int + :rtype: str + """ + + # Output S + # * len(S) = A+B + # * len(As) = len(a) and len(Bs) = len(b) + # * "No aaa and no bbb occurences" + result = "" + + # Logic: Known String Logic (Leverage known string as you are constructing the string) - 100 pass lt easy + # when A or B is way greater, we need the other to break the sequence so the conditions are satisfied + # * We do not have the privilege to use either of them as we traverse + # - Instead use the sequence you know for sure wont have a conflict, that is `aab` or `bba` + # - Reference: https://leetcode.com/problems/string-without-aaa-or-bbb/discuss/227167/Python3-short-and-simple + + # Other than one being zero, both should have a minimum of `2` so that know string assumption works + while A > 0 and B > 0: + if A > B: + result += "aab" + A -= 2 + B -= 1 + elif B > A: + result += "bba" + B -= 2 + A -= 1 + else: + result += "ba" + A -= 1 + B -= 1 + + # Any on A or B being 0 condition + result += "a"*A + result += "b"*B + + return result + + # Previous Tries - Faied logic below + # Try one different method, rearrange after string creation + """ + # Create string with necessary string length and count of a and b + if A > B: + result = ["a"]*A + remaining = ["b"]*B + else: + result = ["b"]*B + remaining = ["a"]*A + + # Rearrange + i = 2 + if len(result) > 2: + while i < len(result): + if result[i] == result[i-1] == result[i-2]: + result = result[:i]+[remaining.pop()]+result[i:] + i += 1 + + print result + if remaining: + result.extend(remaining) + + return "".join(result) + """ + + # Add 2 times or 1 time based on the choices + """ + result = "" + + while A > 0 or B > 0: + if A > B: + if A > 2 and "".join(result[-1:]) != "a": + result += "aa" + A -= 2 + elif A > 0 and "".join(result[-2:]) != "aa": + result += "a" + A -= 1 + else: + if B > 2 and "".join(result[-1:]) != "b": + result += "bb" + B -= 2 + elif B > 0 and "".join(result[-2:]) != "bb": + result += "b" + B -= 1 + + return result + """ + + # Add one/more time based on the choice + """ + result = "" + while A > 0 or B > 0: + while A > 0 and ((len(result) < 2) or (len(result) >= 2 and list(set(result[-2:]))[0] != "a")): + print result, list(set(result[-2:]))[0] + result += "a" + A -= 1 + while B > 0 and ((len(result) < 2) or (len(result) >= 2 and list(set(result[-2:]))[0] != "b")): + result += "b" + B -= 1 + return result + """ From 172cb02e1008ebcabdc1d4725c6f3baca5698180 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Tue, 29 Jan 2019 19:43:52 -0800 Subject: [PATCH 034/489] :city_sunset: minimum ticket cost - dp -100 pass --- .../minimumTicketCost/ticketCost.py | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 ProblemSolving/minimumTicketCost/ticketCost.py diff --git a/ProblemSolving/minimumTicketCost/ticketCost.py b/ProblemSolving/minimumTicketCost/ticketCost.py new file mode 100644 index 0000000..dd4fa27 --- /dev/null +++ b/ProblemSolving/minimumTicketCost/ticketCost.py @@ -0,0 +1,84 @@ +class Solution(object): + def mincostTickets(self, days, cost): + """ + :type days: List[int] + :type costs: List[int] + :rtype: int + """ + + # Logic 1: Solving with Dynamic Programming + # This logic as inreference to the discuss thread - https://leetcode.com/problems/minimum-cost-for-tickets/discuss/228421/Python-solution + + # Create dictionary for faster lookup of days + import collections + days_dict = collections.Counter(days) + + # Create a table of all the day cost + # * Instead of creating a 365 days table, we create until the last day on the days list + table = [0 for i in range(0, days[-1]+1)] + + for i in range(0, days[-1]+1): + # If the current day is not present in the travel days dictionary, it takes the previous value + if i not in days_dict: + table[i] = table[i-1] + else: + # Used max to identify if the index exists + table[i] = min( + table[max(0,i-1)]+cost[0], # per days value + table[max(0,i-7)]+cost[1], # per week value + table[max(0,i-30)]+cost[2] # per year value + ) + + return table[-1] + + """ + # Logic 2: Solving without Dynamic Programming literally going over the logic definition mathmatically + # * fails in some scenarios where the minimum cost could be achieved in a more different way + + # Days of travel + # Costs - {per day, per 7 days, per month} + + n = len(days) + i = 0 + + import math + # How much individual days cost to a week's pass + per_day_cost_week = cost[1]//7 # (days) + minimum_days_benefit_week_pass = cost[1]//cost[0] #(days) + # How much individual week cost to a year's pass + per_day_cost_year = cost[2]//365 # (days) + minimum_days_benefit_month_pass = cost[2]//cost[0] #(days) + + total_cost = 0 + print minimum_days_benefit_week_pass, minimum_days_benefit_month_pass + + while i < n : + # Each day + # * Check yearly cost + # * Check weekly pass benefit + week_days_from_current_day = days[i]+7 + week_count = 0 + j = i + while j < n and days[j] < week_days_from_current_day: + week_count += 1 + j += 1 + month_days_from_current_day = days[i]+30 + month_count = week_count + k = j + while k < n and days[k] < month_days_from_current_day: + month_count += 1 + k += 1 + if week_count > minimum_days_benefit_week_pass: + # Single week cost will be a benefit! + total_cost += cost[1] + i = j + elif month_count > minimum_days_benefit_month_pass: + total_cost += cost[2] + i = k + else: + # Single day cost will only be a benefit! + total_cost += cost[0] + i += 1 + print total_cost, week_count, month_count + return total_cost + """ \ No newline at end of file From 237ee4b8edfe18bc7f00209bc3955fc9543f832d Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Wed, 30 Jan 2019 19:09:38 -0800 Subject: [PATCH 035/489] single Number type problems - lt medium - 100pass * No extra space and linear time is a super challenge! * Find more better methods... --- ProblemSolving/singleNumberII/single.py | 11 ++++++++ ProblemSolving/singleNumberIII/single.py | 33 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 ProblemSolving/singleNumberII/single.py create mode 100644 ProblemSolving/singleNumberIII/single.py diff --git a/ProblemSolving/singleNumberII/single.py b/ProblemSolving/singleNumberII/single.py new file mode 100644 index 0000000..4083034 --- /dev/null +++ b/ProblemSolving/singleNumberII/single.py @@ -0,0 +1,11 @@ +class Solution(object): + def singleNumber(self, nums): + """ + :type nums: List[int] + :rtype: int + """ + + # Sum method + return (3*sum((set(nums))) - sum(nums))//2 + + # diff --git a/ProblemSolving/singleNumberIII/single.py b/ProblemSolving/singleNumberIII/single.py new file mode 100644 index 0000000..2b9e1b8 --- /dev/null +++ b/ProblemSolving/singleNumberIII/single.py @@ -0,0 +1,33 @@ +class Solution(object): + def singleNumber(self, nums): + """ + :type nums: List[int] + :rtype: List[int] + """ + + ### List method - O(N) but the look up for count in a list might increase the iteration + # 100 pass but runs for 2796ms faster than 1.5% + return [i for i in nums if nums.count(i) == 1] + # -------------------------------------------------------------------------------------- + + ### Double Remove method + # * For each element, remove the element from the list and also remove the same element from the list again, if not it is unique + # * Remove element operation would take more than a linear iteration... + # -------------------------------------------------------------------------------------- + + ### Dictionary method + # - uses extra space - would always pass but that is not what we want! + # -------------------------------------------------------------------------------------- + + ### Exor Method + # * Iterate through numbers, continuously exor + # - Exor one by one, check for value change before and after + # - If the amount added is the amount removed, then + + + + + + + + From 6c01b5b0d038c43219a442c6ec3a255bdf5a6449 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Thu, 31 Jan 2019 02:39:47 -0800 Subject: [PATCH 036/489] :bridge_at_night: hand of straights lt medium - 100 pass --- ProblemSolving/handOfStraights/hand.py | 78 ++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 ProblemSolving/handOfStraights/hand.py diff --git a/ProblemSolving/handOfStraights/hand.py b/ProblemSolving/handOfStraights/hand.py new file mode 100644 index 0000000..82a1de0 --- /dev/null +++ b/ProblemSolving/handOfStraights/hand.py @@ -0,0 +1,78 @@ +class Solution(object): + def isNStraightHand(self, hand, W): + """ + :type hand: List[int] + :type W: int + :rtype: bool + """ + + # Logic 1: Like literally solving by hand - 100 pass - longer run time... + + # First, Only if hand//W is a digit this should work + # Hacky whole number division logic + divided_parts = len(hand)/float(W) + if ".0" not in str(divided_parts): + return False + + # Second, make sure the list is sorted and remove consecutive numbers + result = [] + + # Size of the each divided section, some scenarios have divided_parts != size_of_each_part + size_of_each_part = len(hand)//int(divided_parts) + + # Iterate until hand remains + while hand: + # Set initials for every divided_parts + num = size_of_each_part # size of each part + hand = sorted(hand) # make sure it is sorted + result.append([]) # append to result list + i = 0 # initialize i to start at beginning every time (scenario of repetitive elements) + while num and i < len(hand): + # Check for repetitive element + if hand[i] not in result[-1]: + # Check for consecutive element + if result[-1] and result[-1][-1]+1 != hand[i]: + return False + result[-1].append(hand.pop(i)) + num -= 1 + else: + # Case of repetitive element + i += 1 + + # Final result check + if len(result) == int(divided_parts): + return True + else: + return False + + """ + # Different approach ---pending... + # Logic 2 - Using some shortcuts for a cleaner logic + + # By default we use the initial condition to beat unnecessary negative scenario cases + + # First, Only if hand//W is a digit this should work + # Hacky whole number division logic + division = len(hand)/float(W) + if ".0" not in str(division): + return False + + result = [] + # Size of each section that we divide + quant = len(hand)//int(division) + + for i in range(int(division)): + hand = set(hand) + select = hand[:quant] + if sum(select) != sum(range(select[0], select[quant])): + return False + result.append(select) + hand = set(hand[quant:]) + """ + + + + + + + From e72c63ca62dd30b1968c389b2f9aceaaf2470876 Mon Sep 17 00:00:00 2001 From: Srinivas P G Date: Thu, 31 Jan 2019 21:04:19 -0800 Subject: [PATCH 037/489] :bridge_at_night: stone game - lt medium - 100 pass --- ProblemSolving/stoneGame/stone.py | 41 +++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 ProblemSolving/stoneGame/stone.py diff --git a/ProblemSolving/stoneGame/stone.py b/ProblemSolving/stoneGame/stone.py new file mode 100644 index 0000000..3c2522f --- /dev/null +++ b/ProblemSolving/stoneGame/stone.py @@ -0,0 +1,41 @@ +class Solution(object): + def stoneGame(self, piles): + """ + :type piles: List[int] + :rtype: bool + """ + # lt medium 100 pass + # Logic: Recursive method of alex choosing the winning option + # * Go both ways of how lee will respond + def recurse_for_all_options(piles, alex, lee): + + # Null check - Game over condition for alex to win + if not piles: + if alex > lee: + return True + else: + return False + + # Alex turn - Assume alex always takes maximum to win + # * Max pile in the front of the list + if piles[0] > piles[-1]: + piles = piles[1:] + alex += piles[0] + elif piles[0] == piles[-1]: + # when both the front and end are equal, check the next option to maximize + if len(piles) >= 4 and piles[1] > piles[-2]: + alex += piles[-1] + piles = piles[:-1] + else: + alex += piles[0] + piles = piles[1:] + else: + # Max pile in the end of the list + alex += piles[-1] + piles = piles[:-1] + + # Lee's turn - Assume lee takes anything first or last so recurse both the option he takes + # * Or condition to check if Alex wins atleast once + return recurse_for_all_options(piles[:][1:], alex, lee+piles[:][0]) or recurse_for_all_options(piles[:][:-1], alex, lee+piles[:][-1]) + + return recurse_for_all_options(piles, 0, 0) From bcb49849f6ee0c468cf5fdd429566f75763dd353 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Fri, 1 Feb 2019 18:11:31 -0800 Subject: [PATCH 038/489] :city_sunset: keys and room - lt medium - 100 pass no extra space --- ProblemSolving/keysAndRooms/key.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 ProblemSolving/keysAndRooms/key.py diff --git a/ProblemSolving/keysAndRooms/key.py b/ProblemSolving/keysAndRooms/key.py new file mode 100644 index 0000000..e05fee4 --- /dev/null +++ b/ProblemSolving/keysAndRooms/key.py @@ -0,0 +1,30 @@ +class Solution(object): + def canVisitAllRooms(self, rooms): + """ + :type rooms: List[List[int]] + :rtype: bool + """ + + # Logic 1: Graph method would be feasible to solve this problem + # * Also, recusive approach first + # * (No extra space other than the recurse stack) + + def enter_all_rooms(room_num): + + # To maintain a visited list of rooms, conver the entry of visited rooms to 0 + if rooms[room_num] != 0: + current = rooms[room_num] + rooms[room_num] = 0 + + # Take the keys in each room and open other rooms + for key in current: + enter_all_rooms(key) + + # Room 0 is free to enter + enter_all_rooms(0) + + # If all the rooms are 0 then they are all visited else false + if rooms.count(0) == len(rooms): + return True + else: + return False From 4cfa6533c7f7dd78fc02a7eefd161f052b1ad2e7 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Sat, 2 Feb 2019 20:41:47 -0800 Subject: [PATCH 039/489] subtree with deepest nodes - lt medium - 100 pass --- .../subtreeWithAllDeepest/subtree.py | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 ProblemSolving/subtreeWithAllDeepest/subtree.py diff --git a/ProblemSolving/subtreeWithAllDeepest/subtree.py b/ProblemSolving/subtreeWithAllDeepest/subtree.py new file mode 100644 index 0000000..1342b4e --- /dev/null +++ b/ProblemSolving/subtreeWithAllDeepest/subtree.py @@ -0,0 +1,104 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def subtreeWithAllDeepest(self, root): + """ + :type root: TreeNode + :rtype: TreeNode + """ + + # Height of the tree calculation + def height_of_the_tree(node): + if not node: + return 0 + else: + return 1 + max(height_of_the_tree(node.left), height_of_the_tree(node.right)) + + # Traverse the tree + # Rethink: + # * You are required to find the subtree (root of subtree) which has the max height nodes + # -- This can be true only if the farthest nodes are reachable from the same node (I knew about this but was more prone to get the list of nodes rather than just the root, also tried to solve it recursively which took a long time) + # -- Else, find the subtree whose height is the largest either left or right + # * Took inspiration from https://leetcode.com/problems/smallest-subtree-with-all-the-deepest-nodes/discuss/226585/simple-and-faster-python.Hit-it-if-you-like. + while root: + left = height_of_the_tree(root.left) + right = height_of_the_tree(root.right) + + if left == right: + return root + elif left > right: + root = root.left + else: + root = root.right + + + """ + # This idea doesnt work, + # * The part which I think I missed was, + # * Sometimes the common deepest nodes exist wide from each other that the common parent resides way above them in a tree (Solve this!) + self.deepest = 0 + self.deepest_subtree = [] + + def traverse_deepest(node, past_depth, parent): + + if node.left: + traverse_deepest(node.left, past_depth+1, node) + + if node.right: + traverse_deepest(node.right, past_depth+1, node) + + if past_depth > self.deepest: + self.deepest = past_depth + self.deepest_subtree = [parent.val, node.val] + elif past_depth == self.deepest and parent.val == self.deepest_subtree: + self.deepest_subtree.append(node.val) + elif past_depth == self.deepest and parent.val != self.deepest_subtree: + + + traverse_deepest(root, 0, 0) + if len(self.deepest_subtree) == 2: + self.deepest_subtree = self.deepest_subtree[1:] + return self.deepest_subtree + """ + + """ + # Previous Irrelevant Brainstorming... + self.deepest = 0 + self.deepest_subtree = [] + + def depth_of_node(node, depth, parent): + + if not node: + return 0 + else: + depth += max(depth_of_node(node.left, depth+1, node), depth_of_node(node.right, depth+1, node)) + print node.val, depth + if not node.left and not node.right: + if depth >= self.deepest: + self.deepest_subtree = [] + self.deppest = depth + self.deepest_subtree.append(node.val) + if parent.val not in self.deepest_subtree: + self.deepest_subtree.append(parent.val) + return depth + + depth = depth_of_node(root, 0, root) + print depth, self.deepest, self.deepest_subtree + + #def traverse(node): + # + # if not node: + ## return 0 + # else: + + #if depth > self.deepest: + # self.deepest = depth + # self.deepest_subtree = [node.val, node.left.val, node.right.val] + """ + + From d9a450eaa2732af5140925ffb903f5696bf341b2 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Sat, 2 Feb 2019 21:19:24 -0800 Subject: [PATCH 040/489] :bridge_at_night: best time to buy and sell stock - lt medium - 100 pass --- .../bestTimeToBuyAndSellStock/maxProfit.py | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 ProblemSolving/bestTimeToBuyAndSellStock/maxProfit.py diff --git a/ProblemSolving/bestTimeToBuyAndSellStock/maxProfit.py b/ProblemSolving/bestTimeToBuyAndSellStock/maxProfit.py new file mode 100644 index 0000000..c77835f --- /dev/null +++ b/ProblemSolving/bestTimeToBuyAndSellStock/maxProfit.py @@ -0,0 +1,70 @@ +class Solution(object): + def maxProfit(self, prices, fee): + """ + :type prices: List[int] + :type fee: int + :rtype: int + """ + + # Greedy algorithm + + # As we thought, + # * Creating a reference for minimum and maximum values is a trick + # * Be greedy to choose the minimum and execute transaction as soon as we get profit + + # Number of days + n = len(prices) + + # Assume min + minimum = prices[0] + + # Total Money + total = 0 + + for i in range(n): + # If we found a minimum along the way, update it + if prices[i] < minimum: + minimum = prices[i] + # As soon as we get a profit execute transaction + # * Calculate profit as something greater than minimum + fee (Done calculate sell fee here, as atmost 0 is also a profit) + elif prices[i] > minimum + fee: + total += prices[i] - minimum - fee + # Calculate the new minimum now as the executed proces minus the fees (this would be the buy fee) + minimum = prices[i] - fee + #print total + + return total + + """ + # Literal Calculation + + # Number of days + n = len(prices) + mid = n//2 + + # reference array instead of calculating max and min prices as we traverse + #prices_range = sorted(prices) + minimum = prices[0] + + # + total = 0 + bought = False + + # Iterate over the prices range + # * Find the min max as we traverse, calculate the max delta and execute the trade + for i in range(n): + if bought == False and prices[i] <= minimum: + total -= prices[i] + total -= fee + bought = True + if bought == True and prices[i] > minimum+fee: + total += prices[i] + total -= fee + minu + bought = False + + return total + """ + + + From 32d24867c2ea142ce6d68da75790b401789a0d3e Mon Sep 17 00:00:00 2001 From: Srinivas Date: Sun, 3 Feb 2019 16:19:32 -0800 Subject: [PATCH 041/489] :city_sunset: smallest string from leaf - bst - lt medium - 100 pass (faster and space wise) --- .../smallestStringStartingFromLeaf/small.py | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 ProblemSolving/smallestStringStartingFromLeaf/small.py diff --git a/ProblemSolving/smallestStringStartingFromLeaf/small.py b/ProblemSolving/smallestStringStartingFromLeaf/small.py new file mode 100644 index 0000000..b65ed61 --- /dev/null +++ b/ProblemSolving/smallestStringStartingFromLeaf/small.py @@ -0,0 +1,72 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def smallestFromLeaf(self, root): + """ + :type root: TreeNode + :rtype: str + """ + + # Logic1: Recursive with No Extra space - 1 --> as of now 100% faster and less than 100% memory + + # Function to convert the number into alphabet + def number_to_alphabet(num): + # lowercase a ==> ord('a') = 97, so iterate from there + return chr(97+num) + + # Recursively traverse until the leaf nodes + def traverse(node, string): + + # At the leaf node, add the string from the lead to root to the strings list + # * Reverse string constructed to reverse order from root -> leaf and add the leaf character beginning + if node: + if not node.left and not node.right: + return number_to_alphabet(node.val)+string[::-1] + else: + # Compare left and right for minimum lexico, else return left or right + left = traverse(node.left, string+number_to_alphabet(node.val)) + right = traverse(node.right, string+number_to_alphabet(node.val)) + if left and right: + return min(left, right) + elif left: + return left + else: + return right + + + # Logic2: Recursive with Extra space to hold the strings - as of now 100% faster and less than 100% memory + # * Sort the list to obtain the answer finally + + # Recursively traverse until the leaf nodes + def traverse2(node, string): + + # At the leaf node, add the string from the lead to root to the strings list + # * Reverse string constructed to reverse order from root -> leaf and add the leaf character beginning + if node: + if not node.left and not node.right: + self.strings.append(number_to_alphabet(node.val)+string[::-1]) + else: + traverse(node.left, string+number_to_alphabet(node.val)) + traverse(node.right, string+number_to_alphabet(node.val)) + + + # ** Logic1: + # Trigger + return traverse(root, "") + + # ** Logic2: + + # List to hold all strings + #self.strings = [] + + # Trigger it + #traverse2(root, "") + + # Sort and return the first + #return sorted(self.strings)[0] + From c2ba357801ff821423ca03c09475b7021c482c27 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Sun, 3 Feb 2019 19:42:38 -0800 Subject: [PATCH 042/489] :bridge_at_night: 2 key keyboard lt medium 100 pass --- ProblemSolving/2KeysKeyboard/2key.py | 65 ++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 ProblemSolving/2KeysKeyboard/2key.py diff --git a/ProblemSolving/2KeysKeyboard/2key.py b/ProblemSolving/2KeysKeyboard/2key.py new file mode 100644 index 0000000..948fcfd --- /dev/null +++ b/ProblemSolving/2KeysKeyboard/2key.py @@ -0,0 +1,65 @@ +class Solution(object): + def minSteps(self, n): + """ + :type n: int + :rtype: int + """ + + # Logic: + # * Again, the confusion was at the copy decision to make + # - Already knew solution is something to work around the divisibility + # - example: for 20, we know 2, 4, 5 are divisible by 20 but going with 4 gives the minimum steps + # - Recursively going back from square root or half the number n and iterating for divisibility + being recursive helps... + # * Inreference to the golang solution at https://leetcode.com/problems/2-keys-keyboard/discuss/193726/Simple-Golang-solution-beats-100 + + if n < 2: + return 0 + elif n >= 2 and n <= 5: + return n + else: + for i in range(n//2, 1, -1): + if n%i == 0: + return (n//i) + self.minSteps(i) + return n + + """ + # or + import math + if n == 1: + return 0 + else: + for i in range(int(math.sqrt(n)), 1, -1): + if n%i == 0: + return self.minSteps(i) + self.minSteps(n//i) + return n + """ + + """ + # Literally following the problem and working around that doesnt help + # * The challenge remains on deciding when to perform the copy again + # * The is more of a mathematical solution, to understand the properties of the proble, + # + notepad = "A" + copied = "" + steps = 0 + #total = n-1 + # remember it is exactly `n` number you have to reach... + + while len(notepad) < n: + print notepad, copied, steps + # Copy All Operation + if not copied: + copied = notepad + # Copy operation decision + elif n%len(notepad) == 0: + copied = notepad + # Paste the data + else: + notepad += copied + steps += 1 + + return steps + """ + + + From 58e46656bd4745bc6cbeedd3a58d50346c29c393 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Sun, 3 Feb 2019 20:30:39 -0800 Subject: [PATCH 043/489] :bridge_at_night: completness of binary tree lt medium - 100 pass (pending for a better logic soon) --- .../CompletenessOfBinaryTree/complete.py | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 ProblemSolving/CompletenessOfBinaryTree/complete.py diff --git a/ProblemSolving/CompletenessOfBinaryTree/complete.py b/ProblemSolving/CompletenessOfBinaryTree/complete.py new file mode 100644 index 0000000..3da6f0c --- /dev/null +++ b/ProblemSolving/CompletenessOfBinaryTree/complete.py @@ -0,0 +1,60 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def isCompleteTree(self, root): + """ + :type root: TreeNode + :rtype: bool + """ + + + # Logic: + # * Recursively calculate depth of each leaf node and add them into a list + # * Traverse the list to ensure all the it has precedence left-most + + # List of depth of leaf nodes + self.depth_of_leaf = [] + + # Depth recursive function + def depths(node, depth): + + # Record depth at leaf + if not node: + self.depth_of_leaf.append(depth) + else: + # Traverse for left and right depth + depths(node.left, depth+1) + depths(node.right, depth+1) + + # Trigger + depths(root, 0) + + # Traverse for left most precedence + # * Ensure there is not change on the right once it reduces + # * Ensure there is not change more than once + + left_most = self.depth_of_leaf[0] + print self.depth_of_leaf + low = 0 + + for i in range(len(self.depth_of_leaf)): + if self.depth_of_leaf[i] > left_most: + return False + elif self.depth_of_leaf[i] < left_most: + left_most = self.depth_of_leaf[i] + low += 1 + if low > 1: + return False + else: + return True + + + + + + From ccfa358e781590679dd9cdefe38f6bf51d6ba5f4 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Mon, 4 Feb 2019 17:10:41 -0800 Subject: [PATCH 044/489] :city_sunset: binary tree from preOrder + postOrder --- .../construct.py | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 ProblemSolving/constructBinaryTreeFromPreOrderAndPostOrder/construct.py diff --git a/ProblemSolving/constructBinaryTreeFromPreOrderAndPostOrder/construct.py b/ProblemSolving/constructBinaryTreeFromPreOrderAndPostOrder/construct.py new file mode 100644 index 0000000..4d5a702 --- /dev/null +++ b/ProblemSolving/constructBinaryTreeFromPreOrderAndPostOrder/construct.py @@ -0,0 +1,108 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def constructFromPrePost(self, pre, post): + """ + :type pre: List[int] + :type post: List[int] + :rtype: TreeNode + """ + + # Gathering some known properties and findings: + # PreOrder + # * has root at the beginning [Root, Left, Right] + # * Ends with the right most node of the tree + # PostOrder + # * has root at the end [Left, Right, Root] + # * Starts with the left most node of the tree + + # Root + root = TreeNode(pre.pop(0)) + head = post.pop(-1) + + # To help us traverse through the tree + stack = [root] + + + # The learnings until now, appending to the list above: + # * Pre ==> Root, L, R ==> If we find a root, then the subsequent nodes are left and right + # * Post ==> L, R, Root ==> By ensuring we hit a root we can be confident that the all nodes of that subtree have been exercised + # * This seems to be an elegant approach of the same understanding. Using as reference... + + pnode = 0 + + for node in pre: + + current_node = TreeNode(node) + + # Ensure, if the root is reached in post order to confirm the subtree has been exercised + while stack[-1].val == post[pnode]: + stack.pop() + pnode += 1 + + # If there is no left, add left + if not stack[-1].left: + stack[-1].left = current_node + elif not stack[-1].right: + stack[-1].right= current_node + + # Each node can be a root in pre, append to stack to traverse + stack.append(current_node) + + return root + + """ + # We should leverage some logic to iteratively perform the node addition rather than following the steps literally + # * This works by literally following the logic, more better of the same implementation above... + + # pre and post ==> Both are equal number of nodes as guaranteed the answer exists + while pre and post: + + # First, reach the left mode node + left_most_node = post.pop(0) + while pre[0] != left_most_node: + root.left = TreeNode(pre.pop(0)) + root = root.left + stack.append(root) + # Add the left most node + root.left = TreeNode(pre.pop(0)) + + # Second, traverse back up to the root adding the right nodes + # * where to stop ==> The left subtree ends when upper most left child is reached... + while stack and post[0] != stack[0].val: + parent = stack.pop(-1) + if post[0] == parent.val: + post.pop(0) + elif post[0] == parent.left.val: + post.pop(0) + else: + parent.right = post.pop(0) + + # Upper most left node + if stack: + post.pop(0) + # reset root + root = head + # Left subtree is done! + + # Right subtree + root.right = post.pop(-1) + """ + + + + + + + + + + + + + From 5cff0b901a204ad7b7d7eaf59c581600b0b5a73f Mon Sep 17 00:00:00 2001 From: Srinivas Date: Mon, 4 Feb 2019 21:46:10 -0800 Subject: [PATCH 045/489] pending... on this problem - split list into parts - lt medium --- ProblemSolving/splitListToParts/split.py | 44 ++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 ProblemSolving/splitListToParts/split.py diff --git a/ProblemSolving/splitListToParts/split.py b/ProblemSolving/splitListToParts/split.py new file mode 100644 index 0000000..d46ef03 --- /dev/null +++ b/ProblemSolving/splitListToParts/split.py @@ -0,0 +1,44 @@ +class Solution(object): + def splitListToParts(self, root, k): + """ + :type root: ListNode + :type k: int + :rtype: List[ListNode] + """ + + nodes = [] + + # Linked list traversal + while root: + nodes.append(root.val) + root = root.next + + n = len(nodes) + + result = [] + + if n == 0: + return [[]*(k)] + + # Equal parts + if n%k == 0: + divide = n//k + while nodes: + result.append(nodes[:divide]) + nodes = nodes[divide:] + else: + if n < k: + divide = 1 + while nodes: + result.append(nodes[:divide]) + nodes = nodes[divide:] + while len(result) < k: + result.append([]) + else: + divide = k + while len(nodes) > divide: + result = nodes[-divide:] + result + nodes = nodes[:divide] + result = nodes + result + + return result From ef3399e4f8fa1034e265445d11a576ca4305e42c Mon Sep 17 00:00:00 2001 From: Srinivas Date: Mon, 4 Feb 2019 22:16:34 -0800 Subject: [PATCH 046/489] :bridge_at_night: add one row at depth in bst -- lt medium 100 pass --- ProblemSolving/addOneRowToBst/add.py | 53 ++++++++++++++++++++++++++++ ProblemSolving/integerBreak/int.py | 48 +++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 ProblemSolving/addOneRowToBst/add.py create mode 100644 ProblemSolving/integerBreak/int.py diff --git a/ProblemSolving/addOneRowToBst/add.py b/ProblemSolving/addOneRowToBst/add.py new file mode 100644 index 0000000..79de425 --- /dev/null +++ b/ProblemSolving/addOneRowToBst/add.py @@ -0,0 +1,53 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def addOneRow(self, root, v, d): + """ + :type root: TreeNode + :type v: int + :type d: int + :rtype: TreeNode + """ + + # Logic: 40ms 97% --> get to the correct depth insert based on the parent and current node (create a new node and then insert) + def getToDepthAndInsert(node, current_depth, parent): + + # If the current depth is reached, then create new node + if current_depth == d: + new_node = TreeNode(v) + # * If the corresponding depth is greater than the leaf, then add as leaf + # * Else, insert in between + if not node: + if not parent.left: + parent.left = new_node + elif not parent.right: + parent.right = new_node + else: + if parent.left == node: + parent.left = new_node + new_node.left = node + else: + parent.right = new_node + new_node.right = node + else: + # If depth is not reached, recurse + if node: + getToDepthAndInsert(node.left, current_depth+1, node) + getToDepthAndInsert(node.right, current_depth+1, node) + + # Depth being the root itself + if d == 1: + new_node = TreeNode(v) + new_node.left = root + root = new_node + else: + getToDepthAndInsert(root, 1, None) + + return root + + diff --git a/ProblemSolving/integerBreak/int.py b/ProblemSolving/integerBreak/int.py new file mode 100644 index 0000000..3360de5 --- /dev/null +++ b/ProblemSolving/integerBreak/int.py @@ -0,0 +1,48 @@ +class Solution(object): + def integerBreak(self, n): + """ + :type n: int + :rtype: int + """ + + # Hard code minumum value that would be a constant + if n == 2: + return 1 + + # Memoization to maintain a record of max across numbers + memo = [1]*(n+1) + + # Iterate to n+1 so n is calculated for sure + for i in range(2, n+1): + # Calculate the different from 1 to i + for j in range(1, i): + # Compare already existing value vs new difference + calc_max = max(j*memo[i-j], j*(i-j)) + # Store the max difference + memo[i] = max(memo[i], calc_max) + return memo[n] + + + """ + # Logic: Brute force + # * Tried recursive strategy, stuck at places....pending on my own logic. + # * subtract iteratively (as long as atleast 2 + are present) until 0 and record the maximum product + self.memo = [1,1] + + def maxProd(k, current_max): + print self.memo + if k == 1: + return 1 + elif k < len(self.memo): + return self.memo[k] + else: + for i in range(1,k//2+1): + delta = k - i + product = i * maxProd(delta, 0) + if product > current_max: + self.memo.append(product) + return product + + maxProd(n,0) + return self.memo[n] + """ From 1874b01ad343192a2fc283df744c045921da6736 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Tue, 5 Feb 2019 14:50:48 -0800 Subject: [PATCH 047/489] update heapSort + combinationSum 100 pass --- AlgorithmConcepts/sorting/heapSort/heap.py | 35 ++++++++++++++ ProblemSolving/combinationSum/sum.py | 55 +++++++++++++++++++++- 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 AlgorithmConcepts/sorting/heapSort/heap.py diff --git a/AlgorithmConcepts/sorting/heapSort/heap.py b/AlgorithmConcepts/sorting/heapSort/heap.py new file mode 100644 index 0000000..916a534 --- /dev/null +++ b/AlgorithmConcepts/sorting/heapSort/heap.py @@ -0,0 +1,35 @@ +# Logic reference to geekOfGeeks + +def heapify(a, n, index): + largest = index + + left = 2*index+1 + right = 2*index+2 + + if left < n and a[left] > a[largest]: + largest = left + + if right < n and a[right] > a[largest]: + largest = right + + if largest != index: + a[index], a[largest] = a[largest], a[index] + heapify(a, n, largest) + +def heapSort(a): + n = len(a) + + for i in range(n, -1, -1): + heapify(a, n, i) + + for i in range(n-1, 0, -1): + a[i], a[0] = a[0], a[i] + heapify(a, i, 0) + +def main(): + a = [5,2,6,7,9,3,1,0] + heapSort(a) + print a + +main() + diff --git a/ProblemSolving/combinationSum/sum.py b/ProblemSolving/combinationSum/sum.py index 738125e..a88c19d 100644 --- a/ProblemSolving/combinationSum/sum.py +++ b/ProblemSolving/combinationSum/sum.py @@ -1,3 +1,56 @@ +class Solution(object): + def combinationSum(self, candidates, target): + """ + :type candidates: List[int] + :type target: int + :rtype: List[List[int]] + """ + + + # Logic: This iterates through all combination, works 100% but 35ms fast only. + + # Itertools for using product, combinations or permutations + import itertools + + # Result array to hold all the valid combinations + result = [] + + # As repeated elements can be unlimited, we start the iteration with minimum element in the array that adds up to the target + mini = min(candidates) + n = target//mini + + # Using combinations with replacement --> to have all the combination of length r with repeated elements, and check if sum adds up to the target + for i in range(n, 0, -1): + for comb in itertools.combinations_with_replacement(candidates, r=i): + if sum(comb) == target: + result.append(comb) + return result + + + """ + # Another Logic with Recursive strategy + # Reference: https://leetcode.com/problems/combination-sum/discuss/232167/python-simple-backtracking + + result = [] + + def recursive_combinations(temp, index): + + if sum(temp) > target: + return + elif sum(temp) == target: + temp = sorted(temp) + if temp not in result: + result.append(temp) + return + + for i in range(index, len(candidates)): + recursive_combinations(temp+[candidates[i]], index) + + recursive_combinations([], 0) + return result + """ + +""" ### Pending... class Solution(object): @@ -57,7 +110,7 @@ def combinationSum(self, candidates, target): return result - +""" From b45c05bab903b01f359784b2a55850df3977ded3 Mon Sep 17 00:00:00 2001 From: Srinivas Date: Wed, 6 Feb 2019 20:52:18 -0800 Subject: [PATCH 048/489] :bridge_at_night: combinations - lt medium - 100 pass --- ProblemSolving/combinations/combination.md | 80 ++++++++++++++++++++++ ProblemSolving/combinations/combination.py | 70 +++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 ProblemSolving/combinations/combination.md create mode 100644 ProblemSolving/combinations/combination.py diff --git a/ProblemSolving/combinations/combination.md b/ProblemSolving/combinations/combination.md new file mode 100644 index 0000000..f516ab4 --- /dev/null +++ b/ProblemSolving/combinations/combination.md @@ -0,0 +1,80 @@ + +1) A bit hacky solution using inbuilt function `itertools` +``` +class Solution(object): + def combine(self, n, k): + """ + :type n: int + :type k: int + :rtype: List[List[int]] + """ + + # Logic: Use Python Itertools - 120ms 99% faster. + # * K numbers ==> repeat=2 + # * 1..N is the limit ==> range(1,n) + + import itertools + result = [] + + for comb in itertools.combinations(range(1,n+1), r=k): + result.append(comb) + + return result +``` + +2) Same logic above implemented as a single line solution +``` +return [comb for comb in itertools.combinations(range(1,n+1), r=k)] +``` + +3) Recursive with comments on why? +``` +class Solution(object): + def combine(self, n, k): + """ + :type n: int + :type k: int + :rtype: List[List[int]] + """ + """ + # This is the sole idea of a brute force solution: (particularly when k=2) + + # This would be the general brute force logic for k=2 ==> 2 for loops... + # * K input will contain k for loops --> use recursive function to for loop k times... + + # Brute force solution - worst case sceanrio + result = [] + for i in range(1, n+1): + for j in range(1, n+1): + if i != j: + if sorted([i,j]) not in result: + result.append([i,j]) + return result + """ + + # 100 pass 756ms + # Implementing the same brute force solution (reference to the logic above..) + result = [] + + # A loop to carry forward the array constructed and next index to operate + def k_times_for_loops(temp_array, index): + + # debug + #print temp_array + + # Recursive function: First create a decision when to exit... + # what should be the result, return once you get the result + if len(temp_array) >= k: + # Avoid duplicates and same element arrays + if sorted(temp_array) not in result and len(set(temp_array)) == k: + result.append(temp_array) + return + + # Recurse with for loop k times, add the current index to list and operate on next index + for i in range(index, n+1): + k_times_for_loops(temp_array+[i], i+1) + + # Function trigger + k_times_for_loops([], 1) + return result +``` diff --git a/ProblemSolving/combinations/combination.py b/ProblemSolving/combinations/combination.py new file mode 100644 index 0000000..1203ecc --- /dev/null +++ b/ProblemSolving/combinations/combination.py @@ -0,0 +1,70 @@ +class Solution(object): + def combine(self, n, k): + """ + :type n: int + :type k: int + :rtype: List[List[int]] + """ + + """ + # Logic: Use Python Itertools - 120ms 99% faster. + # * K numbers ==> repeat=2 + # * 1..N is the limit ==> range(1,n) + + # Single line solution would be: `return [comb for comb in itertools.combinations(range(1,n+1), r=k)]` + + import itertools + result = [] + + for comb in itertools.combinations(range(1,n+1), r=k): + result.append(comb) + + return result + """ + + + """ + # This is the sole idea of a brute force solution: (particularly when k=2) + + # This would be the general brute force logic for k=2 ==> 2 for loops... + # * K input will contain k for loops --> use recursive function to for loop k times... + + # Brute force solution - worst case sceanrio + result = [] + for i in range(1, n+1): + for j in range(1, n+1): + if i != j: + if sorted([i,j]) not in result: + result.append([i,j]) + return result + """ + + # 100 pass 756ms + # Implementing the same brute force solution (reference to the logic above..) + result = [] + + # A loop to carry forward the array constructed and next index to operate + def k_times_for_loops(temp_array, index): + + # debug + #print temp_array + + # Recursive function: First create a decision when to exit... + # what should be the result, return once you get the result + if len(temp_array) >= k: + # Avoid duplicates and same element arrays + if sorted(temp_array) not in result and len(set(temp_array)) == k: + result.append(temp_array) + return + + # Recurse with for loop k times, add the current index to list and operate on next index + for i in range(index, n+1): + k_times_for_loops(temp_array+[i], i+1) + + # Function trigger + k_times_for_loops([], 1) + return result + + + + From 2d681ff0f3f5891f304a8e9d7493fa9f3b9808fd Mon Sep 17 00:00:00 2001 From: Srinivas Date: Fri, 8 Feb 2019 23:23:21 -0800 Subject: [PATCH 049/489] :sweat: some pending problems that require updates... --- ProblemSolving/bulbSwitch/bulb.py | 26 ++++++ .../serializeAndDeserializeBST/serial.py | 93 +++++++++++++++++++ ProblemSolving/targetSum/target.py | 40 ++++++++ 3 files changed, 159 insertions(+) create mode 100644 ProblemSolving/bulbSwitch/bulb.py create mode 100644 ProblemSolving/serializeAndDeserializeBST/serial.py create mode 100644 ProblemSolving/targetSum/target.py diff --git a/ProblemSolving/bulbSwitch/bulb.py b/ProblemSolving/bulbSwitch/bulb.py new file mode 100644 index 0000000..09ce015 --- /dev/null +++ b/ProblemSolving/bulbSwitch/bulb.py @@ -0,0 +1,26 @@ +# Pending... + +class Solution(object): + def bulbSwitch(self, n): + """ + :type n: int + :rtype: int + """ + + # Time Limit Exceeded Solution + import collections + + # Lets assume 1 in ON and 0 is OFF + # * First steps (1st iteration) also includes constructing the dictionary + # * So, all are ON + switches = collections.Counter(range(1,n+1)) + + for i in range(2, n+1): + if i == 2: + for k in range(i, n+1, i): + switches[k] = 0 + else: + for k in range(i, n+1, i): + switches[k] = switches[k]^1 + + return sum(switches.values()) diff --git a/ProblemSolving/serializeAndDeserializeBST/serial.py b/ProblemSolving/serializeAndDeserializeBST/serial.py new file mode 100644 index 0000000..71a4e29 --- /dev/null +++ b/ProblemSolving/serializeAndDeserializeBST/serial.py @@ -0,0 +1,93 @@ +# Pending... + +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +# Logic: +# * Given a root,Lets use any one traversal technique (pre, post or in order) or level order and obtain a string (or any technique to traverse) +# * Given a string, Lets reverse the corresponding order we select and reconstruct the tree +# * Remember we do it state less so we dont store any variables + +class Codec: + + def serialize(self, root): + """Encodes a tree to a single string. + + :type root: TreeNode + :rtype: str + """ + + def pre_order_traverse(node, encode): + + if not node: + return + + if node.left and node.right: + encode += "/"+ str(node.val) + "L" + str(node.left.val) + "R" + str(node.right.val) + elif node.left: + encode += "/"+ str(node.val) + "L" + str(node.left.val) + elif node.right: + encode += "/"+ str(node.val) + "R" + str(node.right.val) + elif node: + encode += "/"+str(node.val) + + pre_order_traverse(node.left, encode) + pre_order_traverse(node.right, encode) + + return encode + + return pre_order_traverse(root, "") + + + def deserialize(self, data): + """Decodes your encoded data to tree. + + :type data: str + :rtype: TreeNode + """ + + def reverse_traversal_to_bst(node, sequence, root): + + if sequence and node == "": + subtree = list(sequence.pop(0)) + root = node = TreeNode(int(subtree.pop(0))) + if subtree and subtree[0] == "L": + subtree.pop(0) + node.left = TreeNode(int(subtree.pop(0))) + if subtree and subtree[0] == "R": + subtree.pop(0) + node.right= TreeNode(int(subtree.pop(0))) + + elif sequence and node.val == sequence[0]: + subtree = list(sequence.pop(0)) + subtree.pop(0) + if subtree and subtree[0] == "L": + subtree.pop(0) + node.left = TreeNode(int(subtree.pop(0))) + if subtree and subtree[0] == "R": + subtree.pop(0) + node.right= TreeNode(int(subtree.pop(0))) + + if node.left: + reverse_traversal_to_bst(node.left, sequence, root) + if node.right: + reverse_traversal_to_bst(node.right, sequence, root) + + return root + + if not data: + return [] + print data + return reverse_traversal_to_bst("", data.split("/")[1:], "") + + + + +# Your Codec object will be instantiated and called as such: +# codec = Codec() +# print codec.serialize(root) +# codec.deserialize(codec.serialize(root)) diff --git a/ProblemSolving/targetSum/target.py b/ProblemSolving/targetSum/target.py new file mode 100644 index 0000000..f16fe27 --- /dev/null +++ b/ProblemSolving/targetSum/target.py @@ -0,0 +1,40 @@ +# Pending... + +class Solution(object): + def findTargetSumWays(self, nums, S): + """ + :type nums: List[int] + :type S: int + :rtype: int + """ + + # Logic 1: Bruteforce with itertools... + + # BruteForce with all the combinations for the target sum + # * Use itertools + # * add symbols to each integer and then eval() to check for target sum + + import itertools + + count = 0 + + if 0 in nums: + i = 0 + while nums and i < len(nums): + if nums[i] == 0: + del nums[i] + else: + i += 1 + + if not nums: + return 0 + + n = len(nums) + + for combination in itertools.product(["+","-"], repeat=n): + expression = "" + for i in range(n): + expression += combination[i]+str(nums[i]) + if eval(expression) == S: + count += 1 + return count From 8120b5c213ed776b3dc3757949a567c50aafa48c Mon Sep 17 00:00:00 2001 From: Srinivas Date: Sun, 10 Feb 2019 05:07:54 -0800 Subject: [PATCH 050/489] :city_sunrise: lt medium - min number of arrows to burst ballons - 100 pass --- .../minimumNumOfArrowsBurstBallons/mini.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 ProblemSolving/minimumNumOfArrowsBurstBallons/mini.py diff --git a/ProblemSolving/minimumNumOfArrowsBurstBallons/mini.py b/ProblemSolving/minimumNumOfArrowsBurstBallons/mini.py new file mode 100644 index 0000000..b44eaa0 --- /dev/null +++ b/ProblemSolving/minimumNumOfArrowsBurstBallons/mini.py @@ -0,0 +1,62 @@ +class Solution(object): + def findMinArrowShots(self, points): + """ + :type points: List[List[int]] + :rtype: int + """ + + # Logic: Using the start and end indexed + # - Solve by just checking if the ranges bisect + # Steps: + # * Sort the ranges (on start or end) + # * Find if they intersect + + # Sort ranges with the end index so every subset range fall in line + points = sorted(points, key = lambda x: x[1]) + # Control variables + arrow = 0 + previous_range_end = -float("inf") # negative infinity to satify first iteration + # Iterate ranges in points, if start of current range exceeds end of last range then they dont intersect... + for start, end in points: + if start > previous_range_end: + arrow += 1 + # Update end only when the range intersection does not exist + previous_range_end = end + + return arrow + + """ + # Logic1: All scenarios work except for scale case ==> memory limit exceeded (why? this expands the full range which we do not need for this problem, only the arrow count is required...) + # Using set intersection assuming the input is list + ## set(a).intersection(set(b)) or + ## set(a) & set(b) or + ## set(a).intersection(b) + # * this might have a o(N2) complexity + + if len(points) == 1: + return 1 + + minimum_arrows = None + count = 0 + + points = sorted(points) + + for ranges in points: + if minimum_arrows: + minimum_arrows = set(minimum_arrows).intersection(range(ranges[0], ranges[1]+1)) + if not minimum_arrows: + count += 1 + minimum_arrows = range(ranges[0], ranges[1]+1) + + else: + minimum_arrows = range(ranges[0], ranges[1]+1) + + if minimum_arrows: + count += 1 + + return count + + # Other attempts: + # * iteration with enumerate + # * using dictionary to check + """ From d2513a2c076007e8b6952fc085ddc6c2a4de514b Mon Sep 17 00:00:00 2001 From: Srinivas Date: Sun, 10 Feb 2019 16:23:53 -0800 Subject: [PATCH 051/489] :city_sunset::rainbow: short word encoding - lt medium - 100 pass --- ProblemSolving/shortEncodingOfWords/short.py | 30 ++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 ProblemSolving/shortEncodingOfWords/short.py diff --git a/ProblemSolving/shortEncodingOfWords/short.py b/ProblemSolving/shortEncodingOfWords/short.py new file mode 100644 index 0000000..de590db --- /dev/null +++ b/ProblemSolving/shortEncodingOfWords/short.py @@ -0,0 +1,30 @@ +class Solution(object): + def minimumLengthEncoding(self, words): + """ + :type words: List[str] + :rtype: int + """ + + encoded_string = "" + + for word in sorted(words, key=lambda x: len(x), reverse=True): + # One other thing to check is, if the substring is such that # occurs rather than ...# (which is not correct)! + if word+"#" not in encoded_string: + encoded_string += word + "#" + + return len(encoded_string) + + """ + # Logic to satisfy literally the indexes and encoded string, as the length is only required - no need to calculate the indexes + encoded_string = "" + indexes = [] + + # Sort array with length in the decreasing order + for word in sorted(words, key=lambda x: len(x), reverse=True): + if word+"#" in encoded_string: + indexes.append(encoded_string.index(word)) + else: + encoded_string += word + "#" + + return len(encoded_string) + """ From 95704d5667fa4d2117e316a75beed1a87fd0295e Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Tue, 12 Feb 2019 02:51:01 -0800 Subject: [PATCH 052/489] :bridge_at_night: binary gap lt easy 100 pass --- ProblemSolving/binaryGap/bin.py | 57 +++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 ProblemSolving/binaryGap/bin.py diff --git a/ProblemSolving/binaryGap/bin.py b/ProblemSolving/binaryGap/bin.py new file mode 100644 index 0000000..4b338a9 --- /dev/null +++ b/ProblemSolving/binaryGap/bin.py @@ -0,0 +1,57 @@ +class Solution(object): + def binaryGap(self, N): + """ + :type N: int + :rtype: int + """ + + # Brute force method, naive iteration to find consecutive ones + # * One loop for 1st one + # * Second loop for 2nd one + # * We already traverse digits in between, so move forward the index to the second one for the next loop.... + binary = bin(N) + #print binary + + # Control vars + n = len(binary) + maxi = 0 + + # iteration until finding the 1st one + i = 0 + while i < n: + if binary[i] == "1": + # iteration for 2nd one + j = i+1 + while j < n: + # Break as soon as consecutive one is found and adjust index to the consecutive one + if binary[j] == "1": + maxi = max(maxi, j-i) + i = j-1 # Once you break after finding consecutive, while loop iterates i += 1, to handle that negate i before breaking + break + j += 1 + i += 1 + + return maxi + + """ + # Logic: + # * Convert number to a usable form of binary + # * Only the max is required, use 2 pointer method to return on first match --> does not work when consecutive ones need to be worked on. + binary = str(bin(N))[2:] + + left = 0 + right = len(binary)-1 + + while left <= right: + if binary[left] == "1": + break + left += 1 + + while right >= left: + if binary[right] == "1": + break + + right -= 1 + print right, left + return (right - left) + """ From e23b672a4bcaf0ef46ca1b6fe38dc81942ca644e Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Tue, 12 Feb 2019 21:14:10 -0800 Subject: [PATCH 053/489] :bridge_at_night: kth largest in stream --> 100 pass --- ProblemSolving/kthLargestInAStream/kth.py | 42 +++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/ProblemSolving/kthLargestInAStream/kth.py b/ProblemSolving/kthLargestInAStream/kth.py index d6f2d8e..7f48803 100644 --- a/ProblemSolving/kthLargestInAStream/kth.py +++ b/ProblemSolving/kthLargestInAStream/kth.py @@ -1,4 +1,45 @@ +# 100 pass - Logic to sort only initially +# * Every add will be iterated across the k length array +class KthLargest(object): + + def __init__(self, k, nums): + """ + :type k: int + :type nums: List[int] + """ + + # initialize stream we need to use in the function + # * We only require k elements from the start, sort once and add everything later + self.nums = sorted(nums, reverse=True)[:k] + self.k = k-1 + + def add(self, val): + """ + :type val: int + :rtype: int + """ + + # Null criteria + if not self.nums: + self.nums = [val] + return val + + i = 0 + while i < len(self.nums) and self.nums[i] > val: + i += 1 + + self.nums = self.nums[:i] + [val] + self.nums[i:] + self.nums = self.nums[:self.k+1] + + return self.nums[self.k] + +# Your KthLargest object will be instantiated and called as such: +# obj = KthLargest(k, nums) +# param_1 = obj.add(val) + +""" # Pending -- time limit exceeded +# * Sorting everytime add is called doesnt make sense! class KthLargest(object): def __init__(self, k, nums): @@ -30,3 +71,4 @@ def add(self, val): # Your KthLargest object will be instantiated and called as such: # obj = KthLargest(k, nums) # param_1 = obj.add(val) +""" From 3955dac13938a5fb8693c0bcfe7ab709f688a57d Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Wed, 13 Feb 2019 18:41:59 -0800 Subject: [PATCH 054/489] :bridge_at_night: add to array form 100 pass --- ProblemSolving/addToArrayForm/add.py | 43 ++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 ProblemSolving/addToArrayForm/add.py diff --git a/ProblemSolving/addToArrayForm/add.py b/ProblemSolving/addToArrayForm/add.py new file mode 100644 index 0000000..f2fc99d --- /dev/null +++ b/ProblemSolving/addToArrayForm/add.py @@ -0,0 +1,43 @@ +class Solution(object): + def addToArrayForm(self, A, K): + """ + :type A: List[int] + :type K: int + :rtype: List[int] + """ + + # Cracky one line solution - Run @58% and Store @100 faster + return [int(j) for j in str(eval("".join([str(i) for i in A])+"+"+str(K)))] + + """ + # Pending... + # Literal Addition - Iterate O(K) + # * Always positive number + # * Only ADD operation + # * Avoid list of string to integer type conversions... + + # Make K iterable + K = str(K)[::-1] + carry = 0 + n = len(A)-1 + for i in range(len(K)): + if i <= n: + A[n-i] = A[n-i] + int(K[i]) + carry + if A[n-i] > 9: + carry = A[n-i]//10 + A[n-i] = A[n-i]%10 + else: + carry = 0 + else: + A = [int(K[i])] + A + + while n-i >= 0 and carry >= 0: + i += 1 + if n-i == 0: + A = [carry] + A + else: + carry = A[n-i]//10 + A[n-i] = A[n-i]%10 + return A + """ + From 37803e1bd9a69672a7415c987ab9d22249374596 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Fri, 15 Feb 2019 00:44:55 -0800 Subject: [PATCH 055/489] :bridge_at_night: most freq subtree sum - lt medium - 100 pass --- ProblemSolving/mostFrequentSubtreeSum/freq.py | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 ProblemSolving/mostFrequentSubtreeSum/freq.py diff --git a/ProblemSolving/mostFrequentSubtreeSum/freq.py b/ProblemSolving/mostFrequentSubtreeSum/freq.py new file mode 100644 index 0000000..fe08b42 --- /dev/null +++ b/ProblemSolving/mostFrequentSubtreeSum/freq.py @@ -0,0 +1,123 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def findFrequentTreeSum(self, root): + """ + :type root: TreeNode + :rtype: List[int] + """ + + # Logic 2: One tree traversal ==> 96% fast and 100% less storage + # * Record all the subtree sums and add to dictionary + # * calc max_freq from dictionary + + # frequency dictionary + frequency = {} + + # calculate sum of all subtree and record them in dictionary + def subtree_sum_calculate(node): + + # left subtree sum + if node.left: + left_sum = subtree_sum_calculate(node.left) + else: + left_sum = 0 + + # right subtree sum + if node.right: + right_sum = subtree_sum_calculate(node.right) + else: + right_sum = 0 + + # calculate total subtree sum (root+left+right) + subtree_sum_at_node = node.val + left_sum + right_sum + + # Add total sum (subtree_sum_at_node) to dictionary + if subtree_sum_at_node not in frequency: + frequency[subtree_sum_at_node] = 0 + frequency[subtree_sum_at_node] +=1 + + # Return sum of the subtree + return subtree_sum_at_node + + # null check + if not root: + return [] + + # function trigger + subtree_sum_calculate(root) + + # Max freq + max_freq = max(frequency.values()) + result = [] + + # Iterate dictionary for max freq items + for k, v in frequency.items(): + if max_freq == v: + result.append(k) + + return result + + + """ + # Logic 1: Separate functions to take care of subtree sum calc and to traverse tree (kind of reptitive, implement better logic to perform this in one traversal) ==> 6% fast and 100% less storage + + # sums dictionary + sums = {} + + # calculate sum of a subtree + def subtree_sum_calculate(node): + + # left subtree sum + if node.left: + left_sum = subtree_sum_calculate(node.left) + else: + left_sum = 0 + + # right subtree sum + if node.right: + right_sum = subtree_sum_calculate(node.right) + else: + right_sum = 0 + + # Return sum of the subtree + return node.val + left_sum + right_sum + + # Traverse to calculate subtree sum of each node as root + def traverse(node): + + if node: + subtree_sum_node = subtree_sum_calculate(node) + if subtree_sum_node not in sums: + sums[subtree_sum_node] = 0 + sums[subtree_sum_node] +=1 + + if node.left: + traverse(node.left) + if node.right: + traverse(node.right) + + # null check + if not root: + return [] + + # function trigger + traverse(root) + + # Max freq + max_freq = max(sums.values()) + result = [] + + # Iterate dictionary for max freq items + for k, v in sums.items(): + if max_freq == v: + result.append(k) + + return result + """ + From b97ef43f16187f560dd5c461a709dc48c34122d1 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Fri, 15 Feb 2019 19:47:56 -0800 Subject: [PATCH 056/489] :city_sunset: kth largest element in array - lt medium - 100 pass --- ProblemSolving/kthLargestInAnArray/kth.py | 56 +++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 ProblemSolving/kthLargestInAnArray/kth.py diff --git a/ProblemSolving/kthLargestInAnArray/kth.py b/ProblemSolving/kthLargestInAnArray/kth.py new file mode 100644 index 0000000..866f660 --- /dev/null +++ b/ProblemSolving/kthLargestInAnArray/kth.py @@ -0,0 +1,56 @@ +class Solution(object): + def findKthLargest(self, nums, k): + """ + :type nums: List[int] + :type k: int + :rtype: int + """ + + # One line hack using sorted method - 97% + #return sorted(nums, reverse=True)[k-1] + + # Merge Sort and Select - 30% + def mergeSort(arr): + if len(arr) > 1: + #print arr + # Divide the array + n = len(arr)//2 + + # Split array into left and right + left = arr[:n] + right = arr[n:] + + # Recursive call + mergeSort(left) + mergeSort(right) + + i = j = k = 0 + + while i < len(left) and j < len(right): + if left[i] < right[j]: + arr[k] = left[i] + i += 1 + else: + arr[k] = right[j] + j += 1 + k += 1 + + while i < len(left): + arr[k] = left[i] + i += 1 + k += 1 + + while j < len(right): + arr[k] = right[j] + j += 1 + k += 1 + + return arr + else: + return arr + + return mergeSort(nums)[-k] + + + + From 2532999ac832c5486705672183ddb77127cdb58d Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sat, 16 Feb 2019 11:16:53 -0800 Subject: [PATCH 057/489] squares of a sorted array - lt easy - 100 pass (add more logic) --- ProblemSolving/squaresOfASortedArray/square.py | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 ProblemSolving/squaresOfASortedArray/square.py diff --git a/ProblemSolving/squaresOfASortedArray/square.py b/ProblemSolving/squaresOfASortedArray/square.py new file mode 100644 index 0000000..7b4558f --- /dev/null +++ b/ProblemSolving/squaresOfASortedArray/square.py @@ -0,0 +1,11 @@ +class Solution(object): + def sortedSquares(self, A): + """ + :type A: List[int] + :rtype: List[int] + """ + + # This works but we want the squares in the result + #return sorted(A, key= lambda x: x**2) + + return sorted(map(lambda x: x**2, A)) From 689159450fbef907dfe7e1ed6739de6c4ff441d1 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sat, 16 Feb 2019 11:17:56 -0800 Subject: [PATCH 058/489] longest word in dict thru delete - lt medium (pending) --- .../long.py | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 ProblemSolving/longestWordInDictionaryThroughDeleting/long.py diff --git a/ProblemSolving/longestWordInDictionaryThroughDeleting/long.py b/ProblemSolving/longestWordInDictionaryThroughDeleting/long.py new file mode 100644 index 0000000..bddb09b --- /dev/null +++ b/ProblemSolving/longestWordInDictionaryThroughDeleting/long.py @@ -0,0 +1,23 @@ +class Solution(object): + def findLongestWord(self, s, d): + """ + :type s: str + :type d: List[str] + :rtype: str + """ + + # Collections Counter method + from collections import Counter + result = "" + last_temp = "" + for word in d: + temp = list((Counter(s) & Counter(word)).elements()) + print temp, result, word + if len(temp) > len(last_temp): + last_temp = temp + result = word + elif len(temp) == len(last_temp): + if word < "".join(last_temp): + result = word + + return result From 7b60d51a6bf44d7daea31770a04b6b74b1fc4df6 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sat, 16 Feb 2019 11:18:48 -0800 Subject: [PATCH 059/489] elimination game - lt medium - (pendin) --- ProblemSolving/eliminationGame/eliminate.py | 41 +++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 ProblemSolving/eliminationGame/eliminate.py diff --git a/ProblemSolving/eliminationGame/eliminate.py b/ProblemSolving/eliminationGame/eliminate.py new file mode 100644 index 0000000..ebcb224 --- /dev/null +++ b/ProblemSolving/eliminationGame/eliminate.py @@ -0,0 +1,41 @@ +class Solution(object): + def lastRemaining(self, n): + """ + :type n: int + :rtype: int + """ + + # Interpret the Same condition in another way + # - Instead of deleting, we add only the respective digits... + nums = range(1,n+1) + while len(nums) > 1: + n = len(nums) + i = 1 + temp = [] + while i <= n-1: + temp.append(nums[i]) + i += 2 + nums = temp[::-1] + return nums[0] + + + """ + # Literal solve - pseudocode + + nums = range(1,n+1) + + while len(nums) > 1: + n = len(nums) + i = 0 + while i <= n-1: + nums.pop(i) + i += 2 + i = len(nums)-1 + while i >= 0: + nums.pop(i) + i -= 2 + return nums[0] + """ + + + From ece074afd6d94332adf384d27b43c4d047e80abf Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sat, 16 Feb 2019 22:36:45 -0800 Subject: [PATCH 060/489] add more logic for prev prob on squares --- .../squaresOfASortedArray/square.py | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/ProblemSolving/squaresOfASortedArray/square.py b/ProblemSolving/squaresOfASortedArray/square.py index 7b4558f..6a48c6d 100644 --- a/ProblemSolving/squaresOfASortedArray/square.py +++ b/ProblemSolving/squaresOfASortedArray/square.py @@ -8,4 +8,25 @@ def sortedSquares(self, A): # This works but we want the squares in the result #return sorted(A, key= lambda x: x**2) - return sorted(map(lambda x: x**2, A)) + # Logic 1: 100 pass + #return sorted(map(lambda x: x**2, A)) + + # Logic 2 + # Naive iterative without built in functions + result = [] + for i in range(len(A)): + square = A[i]**2 + n = len(result) + if n == 0: + result.append(square) + else: + j = 0 + while j < n: + if result[j] > square: + result = result[:j] + [square] + result[j:] + break + j += 1 + #print j, result, A[i], square + if j == n and len(result) == n: + result.append(square) + return result From 541bec7af1bd010ef154086d23e00148ce220aaa Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sun, 17 Feb 2019 17:56:49 -0800 Subject: [PATCH 061/489] :city_sunset: number of recent calls - lt easy - 100 pass --- ProblemSolving/numberOfRecentCalls/num.py | 29 +++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/ProblemSolving/numberOfRecentCalls/num.py b/ProblemSolving/numberOfRecentCalls/num.py index e8a1cba..1fff4b0 100644 --- a/ProblemSolving/numberOfRecentCalls/num.py +++ b/ProblemSolving/numberOfRecentCalls/num.py @@ -1,3 +1,31 @@ +# Newer better logic +class RecentCounter(object): + + def __init__(self): + # Initialize class variable to track time of pings + self.ping_at_last_time = [] + + + def ping(self, t): + """ + :type t: int + :rtype: int + """ + + # Add time to ping + self.ping_at_last_time.append(t) + # Iterate the first few ping times comparing with current time to eliminate ping > 3000 + while (t-self.ping_at_last_time[0]) > 3000: + self.ping_at_last_time.pop(0) + # Return all the current pings + return len(self.ping_at_last_time) + + +# Your RecentCounter object will be instantiated and called as such: +# obj = RecentCounter() +# param_1 = obj.ping(t) + +""" class RecentCounter(object): def __init__(self): @@ -40,3 +68,4 @@ def ping(self, t): # Your RecentCounter object will be instantiated and called as such: # obj = RecentCounter() # param_1 = obj.ping(t) +""" From b6e97311582a15bd44d6a9787aae48f8fb7d7c1e Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sun, 17 Feb 2019 18:30:32 -0800 Subject: [PATCH 062/489] :bridge_at_night: merge 2 binary trees 100 pass lt easy --- ProblemSolving/mergeTwoBinaryTrees/merge.py | 47 +++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 ProblemSolving/mergeTwoBinaryTrees/merge.py diff --git a/ProblemSolving/mergeTwoBinaryTrees/merge.py b/ProblemSolving/mergeTwoBinaryTrees/merge.py new file mode 100644 index 0000000..bcbada6 --- /dev/null +++ b/ProblemSolving/mergeTwoBinaryTrees/merge.py @@ -0,0 +1,47 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def mergeTrees(self, t1, t2): + """ + :type t1: TreeNode + :type t2: TreeNode + :rtype: TreeNode + """ + + # 100 pass -95% runtime and 100% space + # Recursive function to traverse the trees + def traverse(node1, node2): + + # When both the nodes are present, change value to their sum + if node1 and node2: + node1.val = node1.val+node2.val + + # If both left are present recurse, else if node2 only present then replace node1 as node2 + if node1.left and node2.left: + traverse(node1.left, node2.left) + elif node2.left: + node1.left = node2.left + + # If both right are present recurse, else if node2 only present then replace node1 as node2 + if node1.right and node2.right: + traverse(node1.right, node2.right) + elif node2.right: + node1.right = node2.right + + # Null check for root node of both tree + if not t1: + return t2 + if not t2: + return t1 + + # Recursive call + traverse(t1, t2) + + # Return the root of the first tree + return t1 + From eeeaafb6c89c4cf6bce369019235d9cdfdbdedf8 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Tue, 19 Feb 2019 02:00:53 -0800 Subject: [PATCH 063/489] :bridge_at_night: unique bst - lt medium - 100 pass (DP) --- .../uniqueBinarySearchTrees/uniq.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 ProblemSolving/uniqueBinarySearchTrees/uniq.py diff --git a/ProblemSolving/uniqueBinarySearchTrees/uniq.py b/ProblemSolving/uniqueBinarySearchTrees/uniq.py new file mode 100644 index 0000000..6387410 --- /dev/null +++ b/ProblemSolving/uniqueBinarySearchTrees/uniq.py @@ -0,0 +1,29 @@ +class Solution(object): + def numTrees(self, n): + """ + :type n: int + :rtype: int + """ + + # Logic: Dynamic Programming - 100 100 + + # References: + # * https://leetcode.com/problems/unique-binary-search-trees/discuss/232795/python-easy-DP-beats-98 + # * https://leetcode.com/problems/unique-binary-search-trees/discuss/236389/6-lines-python-DP-solution-beats-100-python3-solutions + + # Subproblems for each number of nodes to n + record = [0]*(n+1) + + # Empty node condition + record[0] = 1 + # One node condition + record[1] = 1 + + # iterate for n from 2 to n + for i in range(2, n+1): + # All the previous subproblems are dependant, a choice made previous affects choice as we proceed --> so 1 to i + for j in range(i): + # Update record with the combinations that could occur for a given previous choice == value at j * future values until i + record[i] += record[j] * record[i-j-1] + return record[n] + From 972f7b2314523f7f9c3cc7f6ef9c6b3297ed299f Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Tue, 19 Feb 2019 22:06:09 -0800 Subject: [PATCH 064/489] :bridge_at_night: find dupicate subtree - lt medium - 100 pass --- ProblemSolving/findDuplicateSubtree/find.py | 49 +++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 ProblemSolving/findDuplicateSubtree/find.py diff --git a/ProblemSolving/findDuplicateSubtree/find.py b/ProblemSolving/findDuplicateSubtree/find.py new file mode 100644 index 0000000..a445e29 --- /dev/null +++ b/ProblemSolving/findDuplicateSubtree/find.py @@ -0,0 +1,49 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def findDuplicateSubtrees(self, root): + """ + :type root: TreeNode + :rtype: List[TreeNode] + """ + + # maintain record of visited subtree + all_subtrees = {} + # Root node results + result = [] + + def traverse(node): + + # Null node condition + if not node: + return "null" + + # Create subtree + subtree_at_current_node = str(node.val) + subtree_at_current_node += traverse(node.left) + subtree_at_current_node += traverse(node.right) + + # Condition to handle already visited nodes + if subtree_at_current_node in all_subtrees: + if all_subtrees[subtree_at_current_node] == 1: + result.append(node) + else: + all_subtrees[subtree_at_current_node] = 0 + # Increment visited nodes + all_subtrees[subtree_at_current_node] += 1 + + # Return subtree to build for every node + return subtree_at_current_node + + # Null node check + if not root: + return [] + + traverse(root) + + return result From 4a70669b54c5acdfcaa8f886e65c6ccb4fbcc9bf Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Wed, 20 Feb 2019 20:14:37 -0800 Subject: [PATCH 065/489] :city_sunset: koko eating bananas - lt medium - 100 pass --- ProblemSolving/kokoEatingBananas/koko.py | 40 ++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 ProblemSolving/kokoEatingBananas/koko.py diff --git a/ProblemSolving/kokoEatingBananas/koko.py b/ProblemSolving/kokoEatingBananas/koko.py new file mode 100644 index 0000000..d2348dd --- /dev/null +++ b/ProblemSolving/kokoEatingBananas/koko.py @@ -0,0 +1,40 @@ +class Solution(object): + def minEatingSpeed(self, piles, H): + """ + :type piles: List[int] + :type H: int + :rtype: int + """ + + # Logic: Divide array by half and navigate correspondingly --> Binary Search Method + # * rewriting the same logic below in bs + + # 2 points for binary navigation + left = 1 + right = max(piles) + + # Iterate until left is equal to right + while left < right: + # Mid + mid = (left + right)//2 + # This was interesting reference: https://leetcode.com/problems/koko-eating-bananas/discuss/152324/C%2B%2BJavaPython-Binary-Search + # * sometimes I cant use % or // to test the number of times the pile divides like 11//4 which is 3 + # * Add divisor to the pile (subtract 1) to ensure it divides to one lesser and suffices + if sum((pile+mid-1)//mid for pile in piles) > H: + left = mid+1 + else: + right = mid + return left + + # Logic: Bruteforce - going from 2 to max piles fails (reduce the search --> use binary search to divide by half and navigate) + """ + if len(piles) == H: + return max(piles) + elif len(piles) < H: + for i in range(2, max(piles)): + if sum(list((pile+i-1)//i for pile in piles)) == H: + return i + else: + return "Cannot eat when len(piles) > H...!" + """ + From b095588df56a1e950b28ddc8bc5ff7d490997627 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sat, 23 Feb 2019 00:53:12 -0800 Subject: [PATCH 066/489] :city_sunset: decode string - 100 pass lt medium --- ProblemSolving/decodeString/decode.py | 34 +++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 ProblemSolving/decodeString/decode.py diff --git a/ProblemSolving/decodeString/decode.py b/ProblemSolving/decodeString/decode.py new file mode 100644 index 0000000..b47d4a4 --- /dev/null +++ b/ProblemSolving/decodeString/decode.py @@ -0,0 +1,34 @@ +class Solution(object): + def decodeString(self, s): + """ + :type s: str + :rtype: str + """ + + # Logic - 100 pass 100% + # * Stack to store and iterate + # ** We will operate only when "]" appear in the string + + stack = [] + + # Iterate across the string + for i in range(len(s)): + # Operate only on ] + if s[i] == "]": + # fetch the sub string within [] + substring = "" + while stack[-1] != "[": + substring = stack.pop() + substring + stack.pop() # removes "[" + # fetch the integer times + num_of_time = "" + while stack and stack[-1].isdigit(): # stack[-1] != "]" + num_of_time = stack.pop() + num_of_time + # Append the decoded string back into stack (to support nested format) + stack.append(int(num_of_time)*substring) + else: + # Add everything except "]" into array + stack.append(s[i]) + # Return stack + return "".join(stack) + From 46fe540e02f4705b92aba79a5012b0c29882a854 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sat, 23 Feb 2019 22:52:09 -0800 Subject: [PATCH 067/489] :bridge_at_night: sum root of leaf numbers - lt medium - 100 pass --- ProblemSolving/sumRootOfLeafNumbers/sum.py | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 ProblemSolving/sumRootOfLeafNumbers/sum.py diff --git a/ProblemSolving/sumRootOfLeafNumbers/sum.py b/ProblemSolving/sumRootOfLeafNumbers/sum.py new file mode 100644 index 0000000..75e0553 --- /dev/null +++ b/ProblemSolving/sumRootOfLeafNumbers/sum.py @@ -0,0 +1,33 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def sumNumbers(self, root): + """ + :type root: TreeNode + :rtype: int + """ + + def traverse(node, number): + + if not node.left and not node.right: + self.leaf_nums.append(int(number)) + else: + if node.left: + traverse(node.left, number+str(node.left.val)) + if node.right: + traverse(node.right, number+str(node.right.val)) + + self.leaf_nums = [] + if not root: + return 0 + traverse(root, str(root.val)) + print self.leaf_nums + return sum(self.leaf_nums) + + + From 869f4a3ce850779636624ee75ae9335ee9ae5964 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sun, 24 Feb 2019 10:23:24 -0800 Subject: [PATCH 068/489] :city_sunrise: summary ranges - lt medium - 100 pass --- ProblemSolving/summaryRanges/summary.py | 48 +++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 ProblemSolving/summaryRanges/summary.py diff --git a/ProblemSolving/summaryRanges/summary.py b/ProblemSolving/summaryRanges/summary.py new file mode 100644 index 0000000..5ae1def --- /dev/null +++ b/ProblemSolving/summaryRanges/summary.py @@ -0,0 +1,48 @@ +class Solution(object): + def summaryRanges(self, nums): + """ + :type nums: List[int] + :rtype: List[str] + """ + + # Logic: O(N) iteration + + # Control variables + n = len(nums) + ranges = [] + start = None + i = 0 + + # O(N) loop - 100 pass + while i < n: + # Set start + if start == None: + start = i + + # Condition when the range is complete + if i+1 < n and nums[i]+1 != nums[i+1]: + # condition when range is just the same number + if i == start: + ranges.append(str(nums[start])) + else: + # condition when we have a range > 1 + ranges.append(str(nums[start])+"->"+str(nums[i])) + start = None + + # Condition when list comes to an end! (Similar to the one above for list end) + if i == n-1: + if start == None: + ranges.append(str(nums[i])) + else: + if nums[i] == nums[i-1]+1: + ranges.append(str(nums[start])+"->"+str(nums[i])) + else: + ranges.append(str(nums[start])) + start = None + + i += 1 + + return ranges + + + From 73d0e8e25e12a92828990d9bc380e2a54bfbe323 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Tue, 26 Feb 2019 18:23:14 -0800 Subject: [PATCH 069/489] :city_sunset: permutation sequence logic 1 - lt medium - 100 pass (slower logic) --- ProblemSolving/permutationSequence/permu.py | 22 +++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 ProblemSolving/permutationSequence/permu.py diff --git a/ProblemSolving/permutationSequence/permu.py b/ProblemSolving/permutationSequence/permu.py new file mode 100644 index 0000000..19d93ee --- /dev/null +++ b/ProblemSolving/permutationSequence/permu.py @@ -0,0 +1,22 @@ +class Solution(object): + def getPermutation(self, n, k): + """ + :type n: int + :type k: int + :rtype: str + """ + + # Logic:1 using itertools python (as usual itertools goes through huge iterations) - just 5% faster + import itertools + result = [] + + # Iterate all permutation in range of n list [1,2,...n] for length 3 + for permutation in itertools.permutations(range(1,n+1), r=n): + result.append(permutation) + + # Return kth permutation - convert int to string before join + return "".join([str(i) for i in result[k-1]]) + + + + From a49c0ee6832ca446af0f0478175d392f4f4d52bf Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Fri, 1 Mar 2019 04:36:19 -0800 Subject: [PATCH 070/489] :city_sunrise: find the town judge - lt easy - 100 pass 100% --- ProblemSolving/findTheTownJudge/find.py | 49 +++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 ProblemSolving/findTheTownJudge/find.py diff --git a/ProblemSolving/findTheTownJudge/find.py b/ProblemSolving/findTheTownJudge/find.py new file mode 100644 index 0000000..ac5b174 --- /dev/null +++ b/ProblemSolving/findTheTownJudge/find.py @@ -0,0 +1,49 @@ +class Solution(object): + def findJudge(self, N, trust): + """ + :type N: int + :type trust: List[List[int]] + :rtype: int + """ + + # Logic 2 - (Just Add/Sub) 100 pass 100 percent + # Dictionary to count all the trust + # * Combining the 2 rule we conclude + # - being trusted, Count add 1 + # - Trusting someoone, Count subtract 1 + # * The one remaining with value equal to N-1 wins + trusted_by_n = [0]*(N+1) + + # Iterate through trust to add/sub the trust scale + for t in trust: + trusted_by_n[t[0]] -= 1 + trusted_by_n[t[1]] += 1 + + # Null Trust list check + if trust == [] and N==1: + return N + + # One with value of trust equal to N-1 is the Judge + if max(trusted_by_n) == N-1: + return trusted_by_n.index(max(trusted_by_n)) + else: + return -1 + + # Logic 1 + # A dictionary to satisfy both the condition + # For a town judge, + # * number of trusters of a person should be N-1 + # * no trust for the one person + """ + trust_dictionary = {} + + for t in trust: + if t[1] not in trust_dictionary: + trust_dictionary[t[1]] = [] + trust_dictionary[t[1]].append(t[0]) + """ + + + + + From ac687b272407863459ced35a046d279dd6fd2ddc Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Fri, 1 Mar 2019 19:42:36 -0800 Subject: [PATCH 071/489] :city_sunset: pending on time limit exceed - lt medium - word subsets --- ProblemSolving/wordSubsets/word.py | 50 ++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 ProblemSolving/wordSubsets/word.py diff --git a/ProblemSolving/wordSubsets/word.py b/ProblemSolving/wordSubsets/word.py new file mode 100644 index 0000000..d9cf359 --- /dev/null +++ b/ProblemSolving/wordSubsets/word.py @@ -0,0 +1,50 @@ +class Solution(object): + def wordSubsets(self, A, B): + """ + :type A: List[str] + :type B: List[str] + :rtype: List[str] + """ + + import collections + universal = [] + sort = [0]*len(B) + + for word in A: + count = 0 + superset = collections.Counter(word) + for subset in range(len(B)): + if sort[subset] == 0: + B[subset] = collections.Counter(B[subset]) + sort[subset] = 1 + intersection = list((B[subset] & superset).elements()) + #print intersection, B[subset], superset + if len(intersection) == sum(B[subset].values()) : + count += 1 + #print count + if count == len(B): + universal.append(word) + return universal + + + """ + # Logic: Subset with sorted ( Doesnt work when high delta sep characters are present ) + universal = [] + sort = [0]*len(B) + + for word in A: + count = 0 + superset = "".join(sorted(word)) + for subset in range(len(B)): + if sort[subset] == 0: + B[subset] = "".join(sorted(B[subset])) + sort[subset] = 1 + print B[subset], superset + if B[subset] in superset: + count += 1 + print count + if count == len(B): + universal.append(word) + return universal + """ + From 0458f21fdcc2cd523e8d3442303ae4f2a03a7908 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Tue, 5 Mar 2019 18:52:31 -0800 Subject: [PATCH 072/489] :city_sunset: find common char lt easy 100 pass - better logic needed (work on it) --- ProblemSolving/findCommonCharacters/find.py | 29 +++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 ProblemSolving/findCommonCharacters/find.py diff --git a/ProblemSolving/findCommonCharacters/find.py b/ProblemSolving/findCommonCharacters/find.py new file mode 100644 index 0000000..f721fad --- /dev/null +++ b/ProblemSolving/findCommonCharacters/find.py @@ -0,0 +1,29 @@ +class Solution(object): + def commonChars(self, A): + """ + :type A: List[str] + :rtype: List[str] + """ + + # Logic: + # 1. Using set ==> we might loose the duplicate common elements + # 2. Using counter() ==> intersection depends on the prefix counter + # 3. bruteforce or naive method + + result = list(A[0]) + + for word in A[1:]: + i = 0 + word = list(word) + while i < len(result): + if result[i] not in word: + del result[i] + else: + del word[word.index(result[i])] + i += 1 + return result + + + + + From fd040830892698a0a5fdc644c67b6b8396ec6c67 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Wed, 6 Mar 2019 07:01:23 -0800 Subject: [PATCH 073/489] :city_sunrise: longest univalue path - lt easy --- ProblemSolving/longestUnivaluePath/long.py | 77 ++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 ProblemSolving/longestUnivaluePath/long.py diff --git a/ProblemSolving/longestUnivaluePath/long.py b/ProblemSolving/longestUnivaluePath/long.py new file mode 100644 index 0000000..6dad56f --- /dev/null +++ b/ProblemSolving/longestUnivaluePath/long.py @@ -0,0 +1,77 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def longestUnivaluePath(self, root): + """ + :type root: TreeNode + :rtype: int + """ + + # Logic + # * Tweak the logic to work for every subtree as the current node == root + # * At every subtree the univalue path through it should be maximum then return + self.max_univalue = 0 + + def univalue_traverse(node): + + if not node: + return 0 + + left_univalue = univalue_traverse(node.left) + right_univalue = univalue_traverse(node.right) + + if node.left and node.val == node.left.val: + left_univalue += 1 + else: + left_univalue = 0 + + if node.right and node.val == node.right.val: + right_univalue += 1 + else: + right_univalue = 0 + + subtree_univalue = left_univalue + right_univalue + + self.max_univalue = max(self.max_univalue, subtree_univalue) + + return max(left_univalue, right_univalue) + + univalue_traverse(root) + return self.max_univalue + + """ + # The below logic would work for vertical paths. The example2 shows horizontal univalue path which this logic doesnt work for. + # Logic: + # * Try Depth first search as it may traverse the possible longest path + # * Track the same value occurrences and update max depth + + self.max_univalue = 0 + + def univalue_traverse(node, parent, univalue): + + # Update univalue path + if node.val == parent: + univalue += 1 + + # Track the maximum univalue path + self.max_univalue = max(univalue, self.max_univalue) + + # Left Node + if node.left: + univalue_traverse(node.left, node.val, univalue) + + # Right Node + if node.right: + univalue_traverse(node.right, node.val, univalue) + + if not root: + return 0 + + univalue_traverse(root, 0, 0) + return self.max_univalue + """ From a5f1d829f16e44919137cc9c60ff60a9aec2c8ca Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Thu, 7 Mar 2019 07:10:20 -0800 Subject: [PATCH 074/489] :city_sunrise: counting bits lt medium 100 pass --- ProblemSolving/countingBits/count.py | 67 ++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 ProblemSolving/countingBits/count.py diff --git a/ProblemSolving/countingBits/count.py b/ProblemSolving/countingBits/count.py new file mode 100644 index 0000000..52245f1 --- /dev/null +++ b/ProblemSolving/countingBits/count.py @@ -0,0 +1,67 @@ +class Solution(object): + def countBits(self, num): + """ + :type num: int + :rtype: List[int] + """ + + # All logic below are 100 pass (variation in timing) + + # Modified logic 2 with better intelligence - 48% + # Ref: https://leetcode.com/problems/counting-bits/discuss/248745/c%2B%2B-100-52ms + + result = [0] + remainder = 1 + for i in range(1, num+1): + # This checkpoints for all 2*remainder which is 2, 4, 8 + if i == 2*remainder: + remainder = 2*remainder + result.append(result[i-remainder]+1) + return result + + # Logic3 - 55% faster - another logic more mathematical + # Reference: https://leetcode.com/problems/counting-bits/discuss/246572/My-python-solution + result = [0]*(num+1) + for i in range(1,num+1): + result[i] = result[i//2] + i%2 + return result + + + """ + # Logic 2: Fails for 10, 11, 12, 13 + # * Use the design of binary numbers to make it faster + # * For every even number visited, there is no num of ones change - 2 (010) + # * For every odd number visited, there is a num of ones change - 3 (011) + # * Also, at each digit increase from 2, 4, 8 the number of digits in a binary are constant until that number 2 (010, 011), 4 (100, 101, 110, 111), 8 (1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111) + result = [0, 1] + remainder = 0 + for i in range(2, num+1): + if i%2 != 0: + result.append(result[-1]+1) + else: + if remainder == 0: + remainder = i + result.append(1) + else: + result.append(result[-1]) + print i, result, remainder + remainder -= 1 + return result + """ + + # Logic 1: 100 pass but Only 5% faster + # * use collections to count + # * O(N) iteration and binary number calculation for each number visited in a loop... + """ + import collections + result = [] + for i in range(num+1): + counts = collections.Counter(bin(i)[2:]) + if "1" in counts: + result.append(counts["1"]) + else: + result.append(0) + return result + """ + + From 1a80daf4849cfcaeca6ee9aa594473ffae772bea Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Wed, 13 Mar 2019 18:26:06 -0700 Subject: [PATCH 075/489] :city_sunset: clumsy factorial - lt medium - 100 pass --- ProblemSolving/clumsyFactorial/clumsy.py | 29 ++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 ProblemSolving/clumsyFactorial/clumsy.py diff --git a/ProblemSolving/clumsyFactorial/clumsy.py b/ProblemSolving/clumsyFactorial/clumsy.py new file mode 100644 index 0000000..913c98c --- /dev/null +++ b/ProblemSolving/clumsyFactorial/clumsy.py @@ -0,0 +1,29 @@ +class Solution(object): + def clumsy(self, N): + """ + :type N: int + :rtype: int + """ + + # Logic 1: Using Eval() function to evaluate expression - 100 pass 25% faster + + # Operations + operation = ["*", "/", "+", "-"] + + # Initial expression + expression = str(N) + + # Control variables + op = 0 + i = N-1 + + # Loop to construct expression + while i > 0: + if op > 3: + op = 0 + expression += operation[op] + str(i) + op += 1 + i -= 1 + + # Return evaluated expression + return eval(expression) From 30e9c7ca4ce01557a671000a6ee3d902b28aada7 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Fri, 15 Mar 2019 22:36:15 -0700 Subject: [PATCH 076/489] :bridge_at_night: cousins in bst - lt easy - 100 pass --- ProblemSolving/cousinsInBinaryTree/cousins.py | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 ProblemSolving/cousinsInBinaryTree/cousins.py diff --git a/ProblemSolving/cousinsInBinaryTree/cousins.py b/ProblemSolving/cousinsInBinaryTree/cousins.py new file mode 100644 index 0000000..1ed6cc4 --- /dev/null +++ b/ProblemSolving/cousinsInBinaryTree/cousins.py @@ -0,0 +1,47 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def isCousins(self, root, x, y): + """ + :type root: TreeNode + :type x: int + :type y: int + :rtype: bool + """ + + # Iterative method - 100 pass 100% faster + + # * Level order search -> Find if they are cousins + stack = [root] + result = [] + + while stack: + n = len(stack) + result.append([]) + while n > 0: + current_node = stack.pop(0) + result[-1].append(current_node.val) + left = right = 0 + if current_node.left: + left = current_node.left.val + stack.append(current_node.left) + if current_node.right: + right = current_node.right.val + stack.append(current_node.right) + if left > 0 and right > 0: + if (left == x and right == y) or (left == y and right == x): + return False + n -= 1 + + for level in result: + if x in level and y in level: + return True + return False + + + From 275055e88287601bc5a70cbf2e70b94f5f625170 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sun, 17 Mar 2019 11:03:25 -0700 Subject: [PATCH 077/489] :city_sunrise: complement of base 10 integer logic1 - lt easy 100 pass --- ProblemSolving/complementOfBase10Integer/comp.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 ProblemSolving/complementOfBase10Integer/comp.py diff --git a/ProblemSolving/complementOfBase10Integer/comp.py b/ProblemSolving/complementOfBase10Integer/comp.py new file mode 100644 index 0000000..5a8dc60 --- /dev/null +++ b/ProblemSolving/complementOfBase10Integer/comp.py @@ -0,0 +1,16 @@ +class Solution(object): + def bitwiseComplement(self, N): + """ + :type N: int + :rtype: int + """ + + # Logic1: With String Replacement (Hacky String Trick) + # --> 28ms (100%) faster and 100% less memory + binary = bin(N)[2:] + binary = binary.replace("0", "Z") + binary = binary.replace("1", "0") + binary = binary.replace("Z", "1") + return int(binary, 2) + + # Logic2: Update pending... From 8e9f4906320afeb9762550cfab636a6702b5b2a8 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Tue, 19 Mar 2019 08:51:07 -0700 Subject: [PATCH 078/489] :city_sunrise: pairs with total%60 - lt easy - 100 pass --- .../pairs.py | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 ProblemSolving/pairsOfSongsWithTotalDurationDivisibleBy60/pairs.py diff --git a/ProblemSolving/pairsOfSongsWithTotalDurationDivisibleBy60/pairs.py b/ProblemSolving/pairsOfSongsWithTotalDurationDivisibleBy60/pairs.py new file mode 100644 index 0000000..89cdf58 --- /dev/null +++ b/ProblemSolving/pairsOfSongsWithTotalDurationDivisibleBy60/pairs.py @@ -0,0 +1,47 @@ +class Solution(object): + def numPairsDivisibleBy60(self, time): + """ + :type time: List[int] + :rtype: int + """ + + + # Mathematically + # * First Number --> Take modulus of 60 of the first number: t%60 and record the value visited in a counter + # * Second Number --> Subtract the t%60 from 60 and obtain the remainder (resulting modulus) --> Add the values accordingly + + + # using dict + # https://leetcode.com/problems/pairs-of-songs-with-total-durations-divisible-by-60/discuss/256738/JavaC%2B%2BPython-Two-Sum-with-K-60 + import collections + rec = collections.Counter() + result = 0 + for t in time: + result += rec[(60-(t%60))%60] + rec[t%60] += 1 + return result + + + """ + # using array - 100 pass + # referring to the https://leetcode.com/problems/pairs-of-songs-with-total-durations-divisible-by-60/discuss/257629/Python-5-lines-array-solution + modulus = [0]*61 + for t in time: + print t, (60 - t%60) % 60, t%60 + modulus[-1] += modulus[(60 - t%60) % 60] + modulus[t%60] += 1 + return modulus[-1] + """ + + + """ + # Traditional 2 loop method - bruteforce --> time limit exceeded obviously.... + n = len(time) + result = 0 + for i in range(n): + for j in range(i+1, n): + if (time[i] + time[j]) % 60 == 0: + result += 1 + return result + """ + From 624f2004fef8ce39f9c2d95000bd793fd45df5da Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Wed, 20 Mar 2019 21:37:19 -0700 Subject: [PATCH 079/489] prime palindrome - lt hard - pending. --- ProblemSolving/primePalindrome/prime.py | 38 +++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 ProblemSolving/primePalindrome/prime.py diff --git a/ProblemSolving/primePalindrome/prime.py b/ProblemSolving/primePalindrome/prime.py new file mode 100644 index 0000000..9fcb5ff --- /dev/null +++ b/ProblemSolving/primePalindrome/prime.py @@ -0,0 +1,38 @@ +# LT Hard --> Pending... +# Time limit exceeded... +class Solution(object): + def primePalindrome(self, N): + """ + :type N: int + :rtype: int + """ + + def isPrime(num): + import math + count = 0 + if num == 1: + return False + for i in range(3, int(math.ceil(math.sqrt(num)+1)), 2): + if num%i == 0: + count += 1 + if count > 0: + return False + return True + + def isPalindrome(num): + if str(num) == str(num)[::-1]: + return True + else: + return False + + while 1: + if (N > 2 and N%2 != 0) or N <= 2: + if isPalindrome(N): + if isPrime(N): + return N + if N < 2 or N%2 == 0: + N += 1 + else: + N += 2 + + From 54f838613d3476aef0abd2946dcf53dea8dbe9ba Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Thu, 21 Mar 2019 08:55:49 -0700 Subject: [PATCH 080/489] :city_sunrise: min falling path sum - lt medium - 100 pass --- ProblemSolving/minimumFallingPathSum/min.py | 31 +++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 ProblemSolving/minimumFallingPathSum/min.py diff --git a/ProblemSolving/minimumFallingPathSum/min.py b/ProblemSolving/minimumFallingPathSum/min.py new file mode 100644 index 0000000..33118ef --- /dev/null +++ b/ProblemSolving/minimumFallingPathSum/min.py @@ -0,0 +1,31 @@ +class Solution(object): + def minFallingPathSum(self, A): + """ + :type A: List[List[int]] + :rtype: int + """ + + # Logic2: 100 pass only 5%faster.. better one yet? + # * Iterate through row and columsn (i,j) + # * For each column, the previous possible combinations are i-1, j-1 and i-1, j and i-1, j+1 + # * Get the minimum of those combinations and add as we iterate to the last row + # * Return the minimum possible from the last row sums. + # * Reference: https://leetcode.com/problems/minimum-falling-path-sum/discuss/186843/Python-easy-4-liner + + for i in range(1, len(A)): # Row iteration + for j in range(len(A)): # Column iteration + A[i][j] += min(A[i-1][j-1] if j-1 >= 0 else float("inf"), A[i-1][j], A[i-1][j+1] if j+1 < len(A) else float("inf")) + print A[-1] + return min(A[-1]) + + """ + # Logic 1: Wrong + # * This takes into account the paths that cannot be traversed in a square like 1,4,9 + min_path = float('inf') + import itertools + for path in itertools.product(*A): + min_path = min(sum(path), min_path) + return min_path + """ + + From 15b77553b85111a88aa231ffad3cc4c274514030 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sun, 24 Mar 2019 12:20:38 -0700 Subject: [PATCH 081/489] even digits - pending -- kick start gogl --- ProblemSolving/evenDigits/even.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 ProblemSolving/evenDigits/even.py diff --git a/ProblemSolving/evenDigits/even.py b/ProblemSolving/evenDigits/even.py new file mode 100644 index 0000000..c232a91 --- /dev/null +++ b/ProblemSolving/evenDigits/even.py @@ -0,0 +1,26 @@ +# Naive add/sub with 2 pointers + +def isEven(num): + for i in list(str(num).strip()): + if int(i)%2 != 0: + return False + return True + +def uniqCalc(N): + left = right = 0 + + while not isEven(N-left) and not isEven(N+right): + #print N+left, N+right, isEven(N+left), isEven(N+right) + left += 1 + right += 1 + + if isEven(N-left): + return left + else: + return right + +testcases = input() +for i in range(testcases): + num = input() + print "Case #"+str(i+1)+": "+str(uniqCalc(num)) + From 83712fa1e5689c54010c4679415c7a89ae62ec9c Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Tue, 26 Mar 2019 08:32:44 -0700 Subject: [PATCH 082/489] :city_sunrise: partition array into 3 equal part sums - lt easy 100 pass --- .../part.py | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 ProblemSolving/partitionArrayIntoThreePartsEqualSum/part.py diff --git a/ProblemSolving/partitionArrayIntoThreePartsEqualSum/part.py b/ProblemSolving/partitionArrayIntoThreePartsEqualSum/part.py new file mode 100644 index 0000000..3fd3df8 --- /dev/null +++ b/ProblemSolving/partitionArrayIntoThreePartsEqualSum/part.py @@ -0,0 +1,56 @@ +class Solution(object): + def canThreePartsEqualSum(self, A): + """ + :type A: List[int] + :rtype: bool + """ + + # Logic 2: + # * Assumption is the array order should be maintained!!!! + # * Almost all the logic in discussion follow total_sum + average method... + # * This sounds interesting: https://leetcode.com/problems/partition-array-into-three-parts-with-equal-sum/discuss/262153/C%2B%2B-beat-98-68ms + + + # Total sum + total_sum = sum(A) + + # If the total cannot be divided into 3 exit + if total_sum%3 != 0: + return False + + # Average per section + average = total_sum//3 + + # Easy thing is there should be no change in order of the array - which I could not anticipate from the problem + + # Iterate to find the sum to average + temp_sum = 0 + count = 0 + for i in A: + temp_sum += i + if temp_sum == average: + count += 1 + temp_sum = 0 + if count > 3: + return False + + # Only true if divided into 3 parts + return count == 3 + + # Logic1: Finding cube root to calculate - Wrong + """ + # Total sum + total_sum = sum(A) + + # Is total a perfect cube root? + # power to 1/3 + temp = abs(total_sum) + temp = temp**(1./3.) + + print total_sum, temp + + if temp: + return True + else: + return False + """ From 896f2e2f9e288075681f9ef3a7ac9d30cbb65181 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Wed, 27 Mar 2019 21:29:54 -0700 Subject: [PATCH 083/489] :bridge_at_night: pending on a much better logic - lt easy 100 pass --- ProblemSolving/designHashset/design.py | 53 ++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 ProblemSolving/designHashset/design.py diff --git a/ProblemSolving/designHashset/design.py b/ProblemSolving/designHashset/design.py new file mode 100644 index 0000000..3f75c43 --- /dev/null +++ b/ProblemSolving/designHashset/design.py @@ -0,0 +1,53 @@ +class MyHashSet(object): + + def __init__(self): + """ + Initialize your data structure here. + """ + + # Write more with BST Tree of internals of a dictionary + + # Logic 1: With Dictionary + # HashSet principles from references + # * Summary + # - Set contains only unique values + # - Internally its a dictionary with element as key and dummy value or present as value + # - Returns null when key is unique and added, else the value if already present + # * https://javahungry.blogspot.com/2013/08/how-sets-are-implemented-internally-in.html + self.ds = {} + + def add(self, key): + """ + :type key: int + :rtype: None + """ + if key in self.ds: + return + self.ds[key] = "present" + + + def remove(self, key): + """ + :type key: int + :rtype: None + """ + if key in self.ds: + del self.ds[key] + + def contains(self, key): + """ + Returns true if this set contains the specified element + :type key: int + :rtype: bool + """ + if key in self.ds: + return True + else: + return False + + +# Your MyHashSet object will be instantiated and called as such: +# obj = MyHashSet() +# obj.add(key) +# obj.remove(key) +# param_3 = obj.contains(key) From 38398dd584fe18ca9a6fc5a7fa564c0cf19f0475 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Thu, 28 Mar 2019 22:34:07 -0700 Subject: [PATCH 084/489] :bridge_at_night: binary tree pruning lt medium - 100 pass --- ProblemSolving/binaryTreePruning/bstPrune.py | 42 ++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 ProblemSolving/binaryTreePruning/bstPrune.py diff --git a/ProblemSolving/binaryTreePruning/bstPrune.py b/ProblemSolving/binaryTreePruning/bstPrune.py new file mode 100644 index 0000000..252feb0 --- /dev/null +++ b/ProblemSolving/binaryTreePruning/bstPrune.py @@ -0,0 +1,42 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def pruneTree(self, root): + """ + :type root: TreeNode + :rtype: TreeNode + """ + + def new_tree(node): + + if node.left: + left_children = new_tree(node.left) + else: + left_children = [] + + if node.right: + right_children = new_tree(node.right) + else: + right_children = [] + + if 1 not in left_children: + node.left = None + + if 1 not in right_children: + node.right = None + + children = [node.val if node else None] + left_children + right_children + + #print children + + return children + + new_tree(root) + return root + + From 1972bbc469b83f5ebab89f9ded38ca322c60b6d2 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Wed, 3 Apr 2019 08:13:24 -0700 Subject: [PATCH 085/489] :city_sunrise: next greater node in linked list - lt medium - 100 pass --- .../nextGreaterNodeInLinkedList/next.py | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 ProblemSolving/nextGreaterNodeInLinkedList/next.py diff --git a/ProblemSolving/nextGreaterNodeInLinkedList/next.py b/ProblemSolving/nextGreaterNodeInLinkedList/next.py new file mode 100644 index 0000000..410d420 --- /dev/null +++ b/ProblemSolving/nextGreaterNodeInLinkedList/next.py @@ -0,0 +1,56 @@ +# Definition for singly-linked list. +# class ListNode(object): +# def __init__(self, x): +# self.val = x +# self.next = None + +class Solution(object): + def nextLargerNodes(self, head): + """ + :type head: ListNode + :rtype: List[int] + """ + + # 100 pass + # - Evaluated most with some help from reference to finish off + # - https://leetcode.com/problems/next-greater-node-in-linked-list/discuss/265508/JavaC%2B%2BPython-Next-Greater-Element + # Stack to keep track of nodes that are of lesser value ( next greater yet to be found) + stack = [] + # Result to hold nodes whose next greater has been found + result = [] + # traverse length of the list as we traverse + count = 0 + + # Traverse List + while head: + # Next greater is found + while stack and head.val > stack[-1][1]: + result[stack.pop()[0]] = head.val + # Append to stack the index of occurrence and value whose next greater should be found + stack.append([count, head.val]) + # Next greater will eventually be found, else 0 so add 0 by default + result.append(0) + count += 1 + head = head.next + return result + + + """ + print stack, result, count + if stack and head.val < stack[-1]: + stack.append(head.val) + else: + while stack and head.val > stack[0]: + stack.pop(0) + result.append(head.val) + stack.append(head.val) + if not stack: + # if count == len(result): + # result.append(0) + #if result[-1] == head.val: + # result.append(0) + #else: + stack.append(head.val) + head = head.next + count += 1 + """ From 222ae9047a0c0b3c8338354c1fb884f3da23ca7c Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sat, 6 Apr 2019 19:13:09 -0700 Subject: [PATCH 086/489] :city_sunset: gcj19 --- Jam/codeJam1.py | 14 +++++++ Jam/codeJam2.py | 18 +++++++++ Jam/codeJam3.go | 18 +++++++++ Jam/codeJam3.py | 94 +++++++++++++++++++++++++++++++++++++++++++++++ Jam/codeJam3_1.py | 57 ++++++++++++++++++++++++++++ 5 files changed, 201 insertions(+) create mode 100644 Jam/codeJam1.py create mode 100644 Jam/codeJam2.py create mode 100644 Jam/codeJam3.go create mode 100644 Jam/codeJam3.py create mode 100644 Jam/codeJam3_1.py diff --git a/Jam/codeJam1.py b/Jam/codeJam1.py new file mode 100644 index 0000000..4674d12 --- /dev/null +++ b/Jam/codeJam1.py @@ -0,0 +1,14 @@ +def give_check(amount): + other = "" + for i in str(amount): + if i == "4": + other += "1" + else: + other += i + return other, str(int(amount)-int(other)) + + +tcs = input() +for i in range(int(tcs)): + one, two = give_check(input()) + print "Case #"+str(i+1)+": "+one+" "+two \ No newline at end of file diff --git a/Jam/codeJam2.py b/Jam/codeJam2.py new file mode 100644 index 0000000..4c9c9db --- /dev/null +++ b/Jam/codeJam2.py @@ -0,0 +1,18 @@ +def solve_maze(grid, lydia_movement): + path = (0,0) + lydia = [(0,0)] + me = "E" if lydia_movement[0] == "S" else "S" + for direction in lydia_movement[1:]: + if direction == "E": + lydia.append((lydia[-1][0]+1, lydia[-1][1])) + me += "S" + else: + lydia.append((lydia[-1][0], lydia[-1][1]+1)) + me += "E" + return me + +tcs = input() +for i in range(int(tcs)): + grid = input() + lydia_movement = raw_input() + print "Case #"+str(i+1)+": "+solve_maze(grid, lydia_movement) \ No newline at end of file diff --git a/Jam/codeJam3.go b/Jam/codeJam3.go new file mode 100644 index 0000000..6b7cc15 --- /dev/null +++ b/Jam/codeJam3.go @@ -0,0 +1,18 @@ +package main + +import ( + "fmt" +) + +func main() { + var testcases int + fmt.Scanf("%d", &testcases) + for i := 0; i < testcases; i++ { + var N, L int + fmt.Scanf("%d %d", &N, &L) + fmt.Println(N, L) + var ciphertext string + fmt.Scanf("%s", &ciphertext) + fmt.Println(ciphertext) + } +} diff --git a/Jam/codeJam3.py b/Jam/codeJam3.py new file mode 100644 index 0000000..76c0a51 --- /dev/null +++ b/Jam/codeJam3.py @@ -0,0 +1,94 @@ +def is_a_prime(number): + #import math + # Assume number is odd, Neglecting 1 and number itself + # 2 is the only even prime + if number%2 == 0: + return False + #for i in range(3, int(math.sqrt(number))+1, 2): + for i in range(3, int(number**(1/2.0))+1, 2): + if number%i == 0: + return False + return True + +def prime_list_under(N): + # Get All the Prime Numbers + # Just get the first 2 primes to get this done... --> this would work when the plaintext is ABC in order? + # Iterate only odd number --> potential prime candidates + primes = [] + for i in range(3, N+1, 2): + if is_a_prime(i): + #if target//i in primes: + # return i, target//i + #else: + primes.append(i) + return primes + +def decrypt(N, ciphertext): + # Get all the primes under N + # get first 2 primes to calculate others? Wont work + primes = prime_list_under(N) + #print primes + crypto_key = [] # Selected primes + # Find the First prime that is divisible here + target = int(ciphertext[0]) + #for prime in primes: + # if target%prime == 0: + # crypto_key.append(prime) + # crypto_key.append(target//prime) + # break + k = 0 + while target%primes[k] != 0: + k += 1 + crypto_key.append(primes[k]) + crypto_key.append(target//primes[k]) + if len(ciphertext) > 1 and int(ciphertext[1])%crypto_key[0] == 0: + crypto_key = crypto_key[::-1] + #print crypto_key + next = crypto_key[-1] + count = 1 + while count < len(ciphertext): + next = int(ciphertext[count])//next + #print ciphertext[count], crypto_key[-1], next, crypto_key + crypto_key.append(next) + count += 1 + """ + stack = [crypto_key[-1], target//crypto_key[-1]] + while stack: + current = stack.pop(0) + if current not in crypto_key: + crypto_key.append(current) + for cipher in ciphertext: + if int(cipher)%current == 0 and (int(cipher)//current not in crypto_key): + stack.append(int(cipher)//current) + """ + alphabets = sorted(set(crypto_key)) + #print crypto_key, alphabets + result = "" + for c in crypto_key: + result += chr(65+alphabets.index(c)) + return result + + +# Encryption Scheme +# * Given N and Length of the ciphertext +# * Ans: +# * Length og the plaintext is len(ciphertext)+1 +# * Choose prime numbers (26) upto N and compute product of adjacent numbers + +""" +# Input Format +2 +103 31 +217 1891 4819 2291 2987 3811 1739 2491 4717 445 65 1079 8383 5353 901 187 649 1003 697 3239 7663 291 123 779 1007 3551 1943 2117 1679 989 3053 +10000 25 +3292937 175597 18779 50429 375469 1651121 2102 3722 2376497 611683 489059 2328901 3150061 829981 421301 76409 38477 291931 730241 959821 1664197 3057407 4267589 4729181 5335543 +""" +tcs = raw_input() +for i in range(int(tcs)): + N, L = raw_input().split(" ") + ciphertext= raw_input().split(" ") + print ciphertext, N, L + if len(ciphertext) != int(L): + print "Case #"+str(i+1)+": "+"Length Not Equal!" + else: + print "Case #"+str(i+1)+": "+decrypt(int(N), ciphertext) \ No newline at end of file diff --git a/Jam/codeJam3_1.py b/Jam/codeJam3_1.py new file mode 100644 index 0000000..79169c3 --- /dev/null +++ b/Jam/codeJam3_1.py @@ -0,0 +1,57 @@ +def is_a_prime(number): + if number%2 == 0: + return False + for i in range(3, int(number**(1/2.0))+1, 2): + if number%i == 0: + return False + return True + +def prime_list_under(N): + primes = [2] + for i in range(3, N+1, 2): + if is_a_prime(i): + primes.append(i) + return primes + +def decrypt(N, ciphertext): + primes = prime_list_under(N) + print primes + crypto_key = [] + future = None + while ciphertext: + target = int(ciphertext.pop(0)) + if not crypto_key and not future: + p = 0 + while p < len(primes) and future == None: + if target%primes[p] == 0 and target//primes[p] in primes: + future = target//primes[p] + p += 1 + crypto_key.append(primes[p-1]) + crypto_key.append(future) + if len(ciphertext) > 1: + if int(ciphertext[1])%crypto_key[0] == 0: + crypto_key = crypto_key[::-1] + future = crypto_key[-1] + else: + if future and target//future in primes: + crypto_key.append(target//future) + future = crypto_key[-1] + + alphabets = sorted(set(crypto_key)) + result = "" + for c in crypto_key: + result += chr(65+alphabets.index(c)) + print crypto_key, alphabets + return result + +tcs = raw_input() +for i in range(int(tcs)): + N, L = raw_input().split(" ") + ciphertext= raw_input().split(" ") + #print ciphertext, N, L + if ciphertext == "": + print "Case #"+str(i+1)+": "+"" + elif len(ciphertext) != int(L): + print "Case #"+str(i+1)+": "+"Length Not Equal!" + else: + print "Case #"+str(i+1)+": "+decrypt(int(N), ciphertext) \ No newline at end of file From 80b1d8c560f3e034dfc4055a606b51f5bc6e6d0f Mon Sep 17 00:00:00 2001 From: sri Date: Thu, 11 Apr 2019 22:38:26 -0700 Subject: [PATCH 087/489] arithSlices attempt 1 --- ProblemSolving/arithmeticSlices/arithmetic.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 ProblemSolving/arithmeticSlices/arithmetic.py diff --git a/ProblemSolving/arithmeticSlices/arithmetic.py b/ProblemSolving/arithmeticSlices/arithmetic.py new file mode 100644 index 0000000..86b3346 --- /dev/null +++ b/ProblemSolving/arithmeticSlices/arithmetic.py @@ -0,0 +1,33 @@ +# Time Limit Exceeded... +class Solution(object): + def numberOfArithmeticSlices(self, A): + """ + :type A: List[int] + :rtype: int + """ + + + def isArithmetic(array, delta): + n = len(array) + for i in range(1, n): + diff = array[i] - array[i-1] + if diff != delta: + return False + return True + + count = 0 + + if len(A) < 3: + return count + + delta = A[1]-A[0] + + #for i in range(3, len(A)+1): + # for comb in itertools.combinations(A, r=i): + for i in range(len(A)): + for j in range(i+1, len(A)+1): + if len(A[i:j]) >= 3: + if isArithmetic(A[i:j], delta): + #print A[i:j] + count += 1 + return count From 78b758a85347c1d1c7a7c4b4b95f5c3d95a9ef06 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Thu, 11 Apr 2019 23:56:45 -0700 Subject: [PATCH 088/489] :bridge_at_night: arithmetic slices --- ProblemSolving/arithmeticSlices/arithmetic.py | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/ProblemSolving/arithmeticSlices/arithmetic.py b/ProblemSolving/arithmeticSlices/arithmetic.py index 86b3346..471280d 100644 --- a/ProblemSolving/arithmeticSlices/arithmetic.py +++ b/ProblemSolving/arithmeticSlices/arithmetic.py @@ -1,4 +1,3 @@ -# Time Limit Exceeded... class Solution(object): def numberOfArithmeticSlices(self, A): """ @@ -6,7 +5,52 @@ def numberOfArithmeticSlices(self, A): :rtype: int """ + # Logic 3: Nice interpolation --> every nth digit after 3 digits adds n more possib + # * https://leetcode.com/problems/arithmetic-slices/discuss/242396/Python-short-solution-with-explanation + + total_sequences = 0 + current_sequences = 0 + if len(A) < 3: + return 0 + + for i in range(2, len(A)): + if A[i] - A[i-1] == A[i-1] - A[i-2]: + current_sequences += 1 + total_sequences += current_sequences + else: + current_sequences = 0 + + return total_sequences + + # Logic 2: 2 pointer method + # * https://leetcode.com/problems/arithmetic-slices/discuss/257940/Two-pointers-O(N)-O(1)-Solution-(No-Math-No-DP) + """ + n = len(A) + + if n < 3: + return 0 + + left = 0 + delta = A[1]-A[0] + count = 0 + + for right in range(2, len(A)): + diff = A[right]-A[right-1] + if diff == delta: + length = right-left+1 + if length >= 3: + count += length-2 + else: + delta = diff + left = right - 1 + + return count + """ + + # Logic 1: BruteForce Login: Time Limit Exceeded + + """ def isArithmetic(array, delta): n = len(array) for i in range(1, n): @@ -22,8 +66,11 @@ def isArithmetic(array, delta): delta = A[1]-A[0] + # Itertools dont work as we want consecutive + # import itertools #for i in range(3, len(A)+1): # for comb in itertools.combinations(A, r=i): + for i in range(len(A)): for j in range(i+1, len(A)+1): if len(A[i:j]) >= 3: @@ -31,3 +78,4 @@ def isArithmetic(array, delta): #print A[i:j] count += 1 return count + """ From 2c1f83c9957fa6fbd787d779fedac262314dfa8e Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Fri, 12 Apr 2019 22:03:34 -0700 Subject: [PATCH 089/489] jam again --- Jam/codeJamRound1A1.py | 221 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 Jam/codeJamRound1A1.py diff --git a/Jam/codeJamRound1A1.py b/Jam/codeJamRound1A1.py new file mode 100644 index 0000000..1ddd7e5 --- /dev/null +++ b/Jam/codeJamRound1A1.py @@ -0,0 +1,221 @@ +# codeJamRound1A1.py + +# Attempt 1 --> Went bruteforce + greedy without taking care of the maximum possibility +# - Sample testcases pass but fails with Wrong answer when submit +""" +def longestSubset(word1, word2): + n = min(len(word1), len(word2)) + count = 0 + for i in range(1, n+1): + if word1[-i:] == word2[-i:]: + count += 1 + return count + +def alien_rhymes(words): + # BruteForce Logic + n = len(words) + pairs = [] + count = 0 + for i in range(n): + for j in range(n): + if i != j and words[i] not in pairs and words[j] not in pairs: + if longestSubset(words[i], words[j]) != 0: + pairs.append(words[i]) + pairs.append(words[j]) + count += longestSubset(words[i], words[j]) + j = n-1 + return count + + + +tcs = raw_input() +for i in range(int(tcs)): + lines = int(raw_input()) + words = [] + for line in range(lines): + words.append(raw_input()) + print "Case #"+str(i+1)+": "+str(alien_rhymes(words)) +""" + + +# Better logic to maximum the subset length +# Still needs work... +""" +def longestSubset(word1, word2): + n = min(len(word1), len(word2)) + count = 0 + for i in range(1, n+1): + if word1[-i:] == word2[-i:]: + count += 1 + return count + +def alien_rhymes(words): + # BruteForce Logic + n = len(words) + pairs = [] + count = 0 + records = {} # Max subset: pair + # Get all possible combination + for i in range(n): + for j in range(n): + if i != j and words[i]: #not in pairs and words[j] not in pairs: + subset = longestSubset(words[i], words[j]) + if subset != 0: + if subset not in records: + records[subset] = (words[i], words[j]) + else: + #while subset in records: + # subset = subset + if type(records[subset]) != list: + records[subset] = list([records[subset]]) + records[subset].append((words[i], words[j])) + #pairs.append(words[i]) + #pairs.append(words[j]) + #count += longestSubset(words[i], words[j]) + #j = n-1 + subsets = sorted(records.keys(), reverse=True) + #print records + for sub in subsets: + while records[sub]: + current = records[sub].pop() + if current[0] not in pairs and current[1] not in pairs: + count += sub + pairs.append(current[0]) + pairs.append(current[1]) + return count + +tcs = raw_input() +for i in range(int(tcs)): + lines = int(raw_input()) + words = [] + for line in range(lines): + words.append(raw_input()) + print "Case #"+str(i+1)+": "+str(alien_rhymes(words)) +""" + +# codeJamRound1A1.py + +# Attempt 1 --> Went bruteforce + greedy without taking care of the maximum possibility +# - Sample testcases pass but fails with Wrong answer when submit +""" +def longestSubset(word1, word2): + n = min(len(word1), len(word2)) + count = 0 + for i in range(1, n+1): + if word1[-i:] == word2[-i:]: + count += 1 + return count + +def alien_rhymes(words): + # BruteForce Logic + n = len(words) + pairs = [] + count = 0 + for i in range(n): + for j in range(n): + if i != j and words[i] not in pairs and words[j] not in pairs: + if longestSubset(words[i], words[j]) != 0: + pairs.append(words[i]) + pairs.append(words[j]) + count += longestSubset(words[i], words[j]) + j = n-1 + return count + + + +tcs = raw_input() +for i in range(int(tcs)): + lines = int(raw_input()) + words = [] + for line in range(lines): + words.append(raw_input()) + print "Case #"+str(i+1)+": "+str(alien_rhymes(words)) +""" + +def longestSubset(word1, word2): + n = min(len(word1), len(word2)) + count = 0 + for i in range(1, n+1): + if word1[-i:] == word2[-i:]: + count += 1 + return count + +def alien_rhymes(words): + # BruteForce Logic + n = len(words) + pairs = [] + count = 0 + records = {} # Max subset: pair + weight = {} + # Get all possible combination + for i in range(n): + for j in range(n): + if i != j and words[i]: #not in pairs and words[j] not in pairs: + subset = longestSubset(words[i], words[j]) + if subset != 0: + if subset not in records: + records[subset] = (words[i], words[j]) + else: + #while subset in records: + # subset = subset + if type(records[subset]) != list: + records[subset] = list([records[subset]]) + records[subset].append((words[i], words[j])) + + if (words[i], words[j]) not in weight: + weight[(words[i], words[j])] = [subset] + else: + weight[(words[i], words[j])].append(subset) + #pairs.append(words[i]) + #pairs.append(words[j]) + #count += longestSubset(words[i], words[j]) + #j = n-1 + subsets = sorted(records.keys(), reverse=True) + #print records + for sub in subsets: + records[sub] = sorted(records[sub], key=lambda x: len(weight[x])) + while records[sub]: + current = records[sub].pop() + if current[0] not in pairs and current[1] not in pairs: + count += sub + pairs.append(current[0]) + pairs.append(current[1]) + return count + +tcs = raw_input() +for i in range(int(tcs)): + lines = int(raw_input()) + words = [] + for line in range(lines): + words.append(raw_input()) + print "Case #"+str(i+1)+": "+str(alien_rhymes(words)) + + +""" +# Input set +4 +2 +TARPOL +PROL +3 +TARPOR +PROL +TARPRO +6 +CODEJAM +JAM +HAM +NALAM +HUM +NOLOM +4 +PI +HI +WI +FI + +Case #1: 2 +Case #2: 0 +Case #3: 6 +Case #4: 2 +""" \ No newline at end of file From 83fdfb674261b2fbb08da7f3c92b87cecdd6a1fc Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Mon, 15 Apr 2019 03:13:05 -0700 Subject: [PATCH 090/489] :city_sunrise: max ancestor difference in tree --- ProblemSolving/maxAncestorDiffTree/maxi.py | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 ProblemSolving/maxAncestorDiffTree/maxi.py diff --git a/ProblemSolving/maxAncestorDiffTree/maxi.py b/ProblemSolving/maxAncestorDiffTree/maxi.py new file mode 100644 index 0000000..a7032d1 --- /dev/null +++ b/ProblemSolving/maxAncestorDiffTree/maxi.py @@ -0,0 +1,33 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def maxAncestorDiff(self, root): + """ + :type root: TreeNode + :rtype: int + """ + + # Logic1: Literally follow the instructions ( No shortcuts ) - 100 pass 10% 100% + # * At every node, maintain the hierarchy and check differences with all ancestors + + def ancestorDiff(node, hierarchy): + + for ancestor in hierarchy: + if abs(ancestor.val - node.val) > self.maxDiff: + self.maxDiff = abs(ancestor.val - node.val) + + if node.left: + ancestorDiff(node.left, hierarchy+[node]) + if node.right: + ancestorDiff(node.right, hierarchy+[node]) + + + self.maxDiff = 0 + ancestorDiff(root, []) + return self.maxDiff + From bf770262aaf9b5f0d6101f7cecc8bcb87d1b8d65 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Thu, 18 Apr 2019 22:44:43 -0700 Subject: [PATCH 091/489] :bridge_at_night: sort an array - lt medium - different methods --- ProblemSolving/sortAnArray/sort.py | 68 ++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 ProblemSolving/sortAnArray/sort.py diff --git a/ProblemSolving/sortAnArray/sort.py b/ProblemSolving/sortAnArray/sort.py new file mode 100644 index 0000000..33faddf --- /dev/null +++ b/ProblemSolving/sortAnArray/sort.py @@ -0,0 +1,68 @@ +class Solution(object): + def sortArray(self, nums): + """ + :type nums: List[int] + :rtype: List[int] + """ + + # Inbuilt function + ## return sorted(nums) + + # Quick sort + def quickSort(array): + less = [] + equal = [] + greater = [] + if len(array) > 1: + pivot = array[0] + for i in array: + if i < pivot: + less.append(i) + elif i == pivot: + equal.append(i) + else: + greater.append(i) + return quickSort(less)+equal+quickSort(greater) + else: + return array + return quickSort(nums) + + # Merge sort way + """ + def mergeSort(array): + if len(array) > 1: + n = len(array)//2 + left = array[:n] + right = array[n:] + + mergeSort(left) + mergeSort(right) + + i = j = k = 0 + + while i < len(left) and j < len(right): + if left[i] < right[j]: + array[k] = left[i] + i += 1 + else: + array[k] = right[j] + j += 1 + k += 1 + + while i < len(left): + array[k] = left[i] + i += 1 + k += 1 + + while j < len(right): + array[k] = right[j] + j += 1 + k += 1 + + return array + + mergeSort(nums) + return nums + """ + + From 0880e8f2c2e1982d27fd68d92cb9e0c48c1f506c Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Wed, 24 Apr 2019 21:16:28 -0700 Subject: [PATCH 092/489] :bridge_at_night: two city scheduling - lt easy - 100 pass --- .../twoCityScheduling/twoCityScheduling.py | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 ProblemSolving/twoCityScheduling/twoCityScheduling.py diff --git a/ProblemSolving/twoCityScheduling/twoCityScheduling.py b/ProblemSolving/twoCityScheduling/twoCityScheduling.py new file mode 100644 index 0000000..9c99882 --- /dev/null +++ b/ProblemSolving/twoCityScheduling/twoCityScheduling.py @@ -0,0 +1,50 @@ +class Solution(object): + def twoCitySchedCost(self, costs): + """ + :type costs: List[List[int]] + :rtype: int + """ + + # First, Sort days based on their delta or difference between cityA and cityB + sorted_differences = sorted(costs, key=lambda x: x[0] - x[1]) + + # N for each city, given array is 2N + N = len(costs)//2 + min_cost = 0 + + # Second, for the first few differences use cityA's value, because the lower differences means x[0] in minimum in x[0]-x[1] + min_cost += sum(i[0] for i in sorted_differences[:N]) + + # Third, for rest of the days use cityB + min_cost += sum(i[1] for i in sorted_differences[N:]) + + return min_cost + + # This logic below doesnot work for [[259,770],[448,54],[926,667],[184,139],[840,118],[577,469]], which makes me think the difference or delta is more important here + """ + # Count for city A and B each + cityA = 0 + cityB = 0 + + # As 2N people are already given. + N = len(costs)//2 + + min_cost = 0 + + for candidate in costs: + if candidate[0] < candidate[1] and cityA < N: + min_cost += candidate[0] + cityA += 1 + elif cityB >= N: + min_cost += candidate[0] + cityA += 1 + else: + min_cost += candidate[1] + cityB += 1 + # Just this wont work as we need to have N in each city + ## min_cost += min(candidate[0], candidate[1]) + print min_cost, cityA, cityB + return min_cost + """ + + From 09fa85fa9f0ace3639fa3ec0b43581b152fecfb8 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sun, 28 Apr 2019 17:16:48 -0700 Subject: [PATCH 093/489] :city_sunset: bst iterator lt medium - 100 pass --- .../binarySearchTreeIterater/bstIterate.py | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 ProblemSolving/binarySearchTreeIterater/bstIterate.py diff --git a/ProblemSolving/binarySearchTreeIterater/bstIterate.py b/ProblemSolving/binarySearchTreeIterater/bstIterate.py new file mode 100644 index 0000000..7264626 --- /dev/null +++ b/ProblemSolving/binarySearchTreeIterater/bstIterate.py @@ -0,0 +1,48 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class BSTIterator(object): + + def __init__(self, root): + """ + :type root: TreeNode + """ + # PreOrder Search BST as soon as you get root + self.result = [] + def preorder(node): + if node: + preorder(node.left) + self.result.append(node.val) + preorder(node.right) + preorder(root) + + + def next(self): + """ + @return the next smallest number + :rtype: int + """ + if self.result: + return self.result.pop(0) + + + def hasNext(self): + """ + @return whether we have a next smallest number + :rtype: bool + """ + if self.result: + return True + else: + return False + + + +# Your BSTIterator object will be instantiated and called as such: +# obj = BSTIterator(root) +# param_1 = obj.next() +# param_2 = obj.hasNext() From 813cacb2d531b05171aaa4ad250fb5d56003b354 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Wed, 1 May 2019 20:02:32 -0700 Subject: [PATCH 094/489] pending problems --- ProblemSolving/findAndReplaceInString/find.py | 47 ++++++++ ProblemSolving/onlineStockPlan/online.py | 48 ++++++++ ProblemSolving/predictTheWinner/predict.py | 113 ++++++++++++++++++ 3 files changed, 208 insertions(+) create mode 100644 ProblemSolving/findAndReplaceInString/find.py create mode 100644 ProblemSolving/onlineStockPlan/online.py create mode 100644 ProblemSolving/predictTheWinner/predict.py diff --git a/ProblemSolving/findAndReplaceInString/find.py b/ProblemSolving/findAndReplaceInString/find.py new file mode 100644 index 0000000..c625d70 --- /dev/null +++ b/ProblemSolving/findAndReplaceInString/find.py @@ -0,0 +1,47 @@ +# Pending.. +class Solution(object): + def findReplaceString(self, S, indexes, sources, targets): + """ + :type S: str + :type indexes: List[int] + :type sources: List[str] + :type targets: List[str] + :rtype: str + """ + + # Logic 2 + # * Create a relation between different elements in the problem + # * Solve accordingly + + # Logic X: A Python Approach using a bunch of inbuilt functions + result = S + for i in range(len(indexes)): + current = sources[i] + index = indexes[i] + n = len(current) + if S[index:index+n] == current: + result = result.replace(current, targets[i], 1) + return result + + # Logic + # * Literally follow instructions --> find and replace + # * No overlap is a good thing and is given! + + # this problem has a bunch of disintegrated list which need to be related. Below logic will pass when the index list is sorted and corresponding entries are present in the targets list. + # Having the indexes sorted would require each related list to arrange accordingly. Rethink a different approach + """ + length_delta = 0 + # Start with index + for i in range(len(indexes)): + # Get the Source + current = sources[i] + index = indexes[i]+length_delta + n = len(current) + # Check the Source is S + if S[index:index+n] == current: + # Replace is match + S= S[:index] + targets[i] + S[index+n:] + length_delta += len(targets[i])-1 + print S + return S + """ diff --git a/ProblemSolving/onlineStockPlan/online.py b/ProblemSolving/onlineStockPlan/online.py new file mode 100644 index 0000000..deffad3 --- /dev/null +++ b/ProblemSolving/onlineStockPlan/online.py @@ -0,0 +1,48 @@ +# Pending... +class StockSpanner(object): + + # Logic to literally follow the question and build solution (no specific technique) + + def __init__(self): + + # Just initialize with a data structure + self.prices = [] + self.span = [] + + def next(self, price): + """ + :type price: int + :rtype: int + """ + + self.prices.append(price) + + # Iterate the days to obtain max consecutive days + n = len(self.prices) + + # Track count - account to track max to work for large num of days + max_consecutive = 0 + count_progress = 0 + + # Iteration from the current day backwards + i = n-1 + while i >= 0: + if self.prices[i] <= price: + count_progress += 1 + else: + break + + # Maximum condition + #if count_progress > max_consecutive: + # max_consecutive = count_progress + + i -= 1 + + self.span.append(count_progress) + + return count_progress + + +# Your StockSpanner object will be instantiated and called as such: +# obj = StockSpanner() +# param_1 = obj.next(price) diff --git a/ProblemSolving/predictTheWinner/predict.py b/ProblemSolving/predictTheWinner/predict.py new file mode 100644 index 0000000..b38f6b8 --- /dev/null +++ b/ProblemSolving/predictTheWinner/predict.py @@ -0,0 +1,113 @@ +# Pending... +class Solution(object): + def PredictTheWinner(self, nums): + """ + :type nums: List[int] + :rtype: bool + """ + + # Maximizing the Total Score + # Known facts: + # * no player can skip turns + # * once a player takes a score no one else can take it + # * taking is only possible from beginning or the end... + # * Consider the next score to play and make a decision + + def gameOn(scores, p1, p2): + + # The decision when all the scores has expired + if not scores: + if p1 > p2: + return True + else: + return False + + """ + # Player 1s choice + # * Even condition of array: try to maximize the score + if len(scores)%2 == 0: + next_chance_0 = + next_chance_final = + + else: + # Odd condition when there is no choice: If there is no possibility of maximum in the next turn choose the current maximum + if scores[0] > scores[-1]: + p1 += scores[0] + scores = scores[1:] + else: + p1 += scores[-1] + scores = scores[:-1] + + print scores + + # Player 2nd choice can go both ways... + if scores: + return (gameOn(scores[:][1:], p1, p2+scores[:][0])) or (gameOn(scores[:][:-1], p1, p2+scores[:][-1])) + else: + return gameOn(scores, p1, p2) + """ + """ + if scores: + # Both taking from the beginning of the array + # Both taking from the end of the array + # One takes beginning and one at the end + print scores + if len(scores)%2 != 0: + return (gameOn(scores[:][2:], p1+scores[:][0], p2+scores[:][1])) or (gameOn(scores[:][:-2]+scores[:][-1], p1, p2+scores[:][-2])) + elif len(scores) == 1: + if len(nums)%2 == 0: + return gameOn([], p1, p2+scores[0]) + else: + return gameOn([], p1+scores[0], p2) + else: + return (gameOn(scores[:][1:-1], p1+scores[:][0], p2+scores[:][-1])) or (gameOn(scores[:][1:-1], p1+scores[:][-1], p2+scores[:][0])) + else: + return gameOn(scores, p1, p2) + + # Start with initial scores + return gameOn(nums, 0, 0) + """ + + """ + # Greedy for the max score in each step (0 or -1) will not work as the player work to maximize their total score. We need to consider the total score, a player might take lower score in current turn to anticipate to snatch a better score next turn -- implement this.... + + # Logic: Player 1 is Greedy always! + # * Lets assume player 1 always greedy and goes for the maximum element either at the start or the end + # * For player 2, lets assume he is also greedy always + + # Conditions Faced: + # * when there are even number of scores, having player 1 and player 2 play back to back with recursive works + # * when there is odd number of scores, it doesnt. think of something! + + def gameOn(scores, p1, p2): + + # The decision when all the scores has expired + if not scores: + if p1 > p2: + return True + else: + return False + + # Player 1s choice + if scores[0] > scores[-1]: + p1 += scores[0] + scores = scores[1:] + else: + p1 += scores[-1] + scores = scores[:-1] + + print scores + + # Player 2nd choice + if scores: + if scores[0] > scores[-1]: + return gameOn(scores[:][1:], p1, p2+scores[:][0]) + else: + return gameOn(scores[:][:-1], p1, p2+scores[:][-1]) + else: + return gameOn(scores, p1, p2) + + # Start with initial scores + return gameOn(nums, 0, 0) + """ + From f08a0a898dd13766abf33f9d18f520b7d919d968 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Fri, 3 May 2019 09:33:47 -0700 Subject: [PATCH 095/489] :sunrise: bin with alternate bits --> lt easy 100 pass --- .../binaryNumberWithAlternatingBits/bin.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 ProblemSolving/binaryNumberWithAlternatingBits/bin.py diff --git a/ProblemSolving/binaryNumberWithAlternatingBits/bin.py b/ProblemSolving/binaryNumberWithAlternatingBits/bin.py new file mode 100644 index 0000000..b546d77 --- /dev/null +++ b/ProblemSolving/binaryNumberWithAlternatingBits/bin.py @@ -0,0 +1,16 @@ +class Solution(object): + def hasAlternatingBits(self, n): + """ + :type n: int + :rtype: bool + """ + + # Simple O(N) iteration over the binary representation + # 100 pass 79 + n_bin = bin(n)[2:] + for i in range(len(n_bin)-1): + if n_bin[i] != n_bin[i+1]: + pass + else: + return False + return True From 1b7e11ad85e62daea1d1cb3086b8db41e6a78c2a Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sat, 4 May 2019 04:22:55 -0700 Subject: [PATCH 096/489] jam practice --- Jam/codeJamRound1C1.py | 86 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 Jam/codeJamRound1C1.py diff --git a/Jam/codeJamRound1C1.py b/Jam/codeJamRound1C1.py new file mode 100644 index 0000000..94bd5cd --- /dev/null +++ b/Jam/codeJamRound1C1.py @@ -0,0 +1,86 @@ +# Rock, Paper, Scissors Game +# * Make the Robot win against all the oponents +# - R Wins S losses P +# - P Wins R losses S +# - S Wins P losses R +# No Matter How the Numbers are assigned? Means you should win all the oponents individually!!!! + +# In order to win what you require +win = { + "S": "R", + "P": "S", + "R": "P" +} + +def match(o1, o2): + for i, j in zip(o1, o2): + if i == j: + continue + else: + if win[j] == i: + return o1 + else: + return o2 + +# Function to create the winning program +def win_match(program, winner): + # Find all the winning combinations... + if program in each_win: + return winner + + # the first win move + #each_win[program].append(win[program[0]]) + + # Other possibilities + if len(each_win.keys()) == 0: + each_win[program] = [] + n = len(program) + for i in range(n+1): + if i < n: + possible = program[:i] + win[program[i]] + each_win[program].append(possible) + else: + possible = program[:i] + win[program[0]] + each_win[program].append(possible) + + if winner == "": + return each_win[program] + else: + if type(winner) == list: + for winp in each_win: + for w in each_win[winp]: + #print w, program + if match(w, program) == w: + return w + else: + if len(winner) >= len(program) and match(winner, program) != winner: + return None + elif len(winner) < len(program): + return winner+win[program[len(winner)]] + else: + return winner + +# Test cases handle +tcs = raw_input() +for i in range(int(tcs)): + Oponents = int(raw_input()) + winning_combination = "" + fail = 0 + # Record win program of each oponent program + each_win = {} + for j in range(Oponents): + Program = raw_input() + if fail == 0: + winning_combination = win_match(Program, winning_combination) + if not winning_combination: + fail = 1 + #print winning_combination, each_win + if fail == 1: + print "Case #"+str(i+1)+": "+"IMPOSSIBLE" + else: + if type(winning_combination) == list: + winning_combination = winning_combination[0] + print "Case #"+str(i+1)+": "+winning_combination + + + From d08bdc32941a744f89a83f9b53f876edd579fbe5 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sat, 25 May 2019 16:53:18 -0700 Subject: [PATCH 097/489] :city_sunrise: remove all adj duplicates - lt easy - 100 pass --- .../removeAllAdjacentDuplicates/remove.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 ProblemSolving/removeAllAdjacentDuplicates/remove.py diff --git a/ProblemSolving/removeAllAdjacentDuplicates/remove.py b/ProblemSolving/removeAllAdjacentDuplicates/remove.py new file mode 100644 index 0000000..07661a0 --- /dev/null +++ b/ProblemSolving/removeAllAdjacentDuplicates/remove.py @@ -0,0 +1,18 @@ +class Solution(object): + def removeDuplicates(self, S): + """ + :type S: str + :rtype: str + """ + + # Stack logic: Pop until the values are same else push + stack = [] + + for element in S: + if not stack: + stack.append(element) + elif stack[-1] != element: + stack.append(element) + else: + stack.pop() + return "".join(stack) From 707d2b3bfcd848aa598abb1605c1d3c857e872df Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Tue, 28 May 2019 17:21:16 +0530 Subject: [PATCH 098/489] :city_sunset: bst with max path sum - lt hard - 100 pass --- .../binaryTreeMaximumPathSum/bin.py | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 ProblemSolving/binaryTreeMaximumPathSum/bin.py diff --git a/ProblemSolving/binaryTreeMaximumPathSum/bin.py b/ProblemSolving/binaryTreeMaximumPathSum/bin.py new file mode 100644 index 0000000..3780d74 --- /dev/null +++ b/ProblemSolving/binaryTreeMaximumPathSum/bin.py @@ -0,0 +1,109 @@ +# Definition for a binary tree node. +# class TreeNode(object): +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution(object): + def maxPathSum(self, root): + """ + :type root: TreeNode + :rtype: int + """ + + # Logic 3 + # * Same traverse logic as 2, but calculate all possible values possible + # * Compare + # - current max calculate based on the current path + # - current node value and left + # - current node value and right + # - current both left and right ( for instance when this only a root way path ) + # - current node itself + + # initial max value + self.maxi = -float('inf') + + def traverse(node): + + # Calculate left and right sum + left_sum = traverse(node.left) if node.left else 0 + right_sum = traverse(node.right) if node.right else 0 + + # Calculate max as we defined + self.maxi = max(self.maxi, node.val+left_sum, node.val+right_sum, node.val+left_sum+right_sum, node.val) + + # Return the path value as we traverse, compare with an additional "0", because we dont want a path which reduces the total path value + return node.val + max(left_sum, right_sum, 0) + + traverse(root) + + return self.maxi + + """ + # Logic 2 + # * The challenge is to find any path that also goes without the root? + # * A: To visualize such a logic, assume we always go from left to right to any node, then we use pre-order + # * B1: After we do the preorder arrangement we then calculate the maximum path by another iteration + # * B2: Improvise - We could also do a inbuilt iteration within the preorder loof itself. + + self.nodes_list = [] + self.maxi = -float('inf') + sumi = 0 + + def traverse(node, sumi): + + self.nodes_list.append(node.val) + sumi += node.val + + if sumi > self.maxi: + self.maxi = sumi + + if node.left: + lsum = traverse(node.left, sumi) + else: + lsum = 0 + + if node.right: + rsum = traverse(node.right, lsum) + else: + rsum = 0 + + return lsum + rsum + + traverse(root, sumi) + return self.maxi + """ + + """ + # Logic 1 + # * PreOrder and Calculate + + self.preorder_list = [] + + def preorder_traverse(node): + + self.preorder_list.append(node.val) + if node.left: + preorder_traverse(node.left) + if node.right: + preorder_traverse(node.right) + + preorder_traverse(root) + + n = len(self.preorder_list) + maxi = -float('inf') + sumi = 0 + for i in range(n): + print sumi, maxi + sumi += self.preorder_list[i] + if sumi > maxi: + maxi = sumi + else: + sumi = self.preorder_list[i] + return maxi + """ + + + + From 0b0e35807dcfaee5a5fe62f98782bee538c93fe3 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Tue, 28 May 2019 22:25:10 +0530 Subject: [PATCH 099/489] :bridge_at_night: height checker lt easy 100 pass --- ProblemSolving/heightChecker/height.py | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 ProblemSolving/heightChecker/height.py diff --git a/ProblemSolving/heightChecker/height.py b/ProblemSolving/heightChecker/height.py new file mode 100644 index 0000000..1a56635 --- /dev/null +++ b/ProblemSolving/heightChecker/height.py @@ -0,0 +1,32 @@ +class Solution(object): + def heightChecker(self, heights): + """ + :type heights: List[int] + :rtype: int + """ + + # Logic 2 + # Looks hacky, I was thinking of just diff the sorted(array) vs array + + s_heights = sorted(heights) + count = 0 + for i in range(len(heights)): + if heights[i] != s_heights[i]: + count += 1 + return count + + """ + # Logic 1 + # As we iterate through the array + # * Record all the irregularities and append to a list + n = len(heights) + students = [] + i = 0 + while i < len(heights): + if (i+1 < len(heights) and heights[i+1] < heights[i]) or (i-1 >= 0 and heights[i-1] > heights[i]): + students.append(heights[i]) + heights.pop(i) + i += 1 + return len(students) + """ + From bb245664e22ab4d1752622a87412f4bd32eca35a Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Thu, 30 May 2019 09:52:55 +0530 Subject: [PATCH 100/489] :city_sunrise: robot bounded in circle lt easy 100 pass --- ProblemSolving/robotBoundedInCircle/robot.py | 62 ++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 ProblemSolving/robotBoundedInCircle/robot.py diff --git a/ProblemSolving/robotBoundedInCircle/robot.py b/ProblemSolving/robotBoundedInCircle/robot.py new file mode 100644 index 0000000..74b6974 --- /dev/null +++ b/ProblemSolving/robotBoundedInCircle/robot.py @@ -0,0 +1,62 @@ +class Solution(object): + def isRobotBounded(self, instructions): + """ + :type instructions: str + :rtype: bool + """ + + # Logic 1: O(4n) + # * Execute the directions in order and check if origin is reached + # * Increment the number of times to execute the instructions. Got pass in 4 + # * Reference: https://leetcode.com/problems/robot-bounded-in-circle/discuss/300372/python-4*instructions-O(n) + + # Convert Instructions to some number of times until reaches the origin, this can be infinite or some even count + instructions += instructions*3 + + # Directions + # * based on the face -> L,R of each + directions = { + "N": ['W', 'E'], + "S": ['E', 'W'], + "E": ['N', 'S'], + "W": ['S', 'N'] + } + + # Facing direction + face = "N" + + # Current co-ordinate + x, y = 0, 0 + + # One Full Loop of the Instructions + + # Intructions iteration + for ins in instructions: + # Set face based on the directions + if ins == "L": + face = directions[face][0] + elif ins == "R": + face = directions[face][1] + else: + # G --> movement in the particular direction of face + if face == "N": + y += 1 + elif face == "S": + y -= 1 + elif face == "E": + x += 1 + else: + x -= 1 + + if x == 0 and y == 0: + return True + else: + return False + + + + + + + + From cb588f0e8038f3a6e23781525df0aeb86bd1284d Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Thu, 30 May 2019 15:22:39 +0530 Subject: [PATCH 101/489] :city_sunset: valid boomerang lt easy - 100 pass --- ProblemSolving/validBoomerang/valid.py | 42 ++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 ProblemSolving/validBoomerang/valid.py diff --git a/ProblemSolving/validBoomerang/valid.py b/ProblemSolving/validBoomerang/valid.py new file mode 100644 index 0000000..d6c49f6 --- /dev/null +++ b/ProblemSolving/validBoomerang/valid.py @@ -0,0 +1,42 @@ +class Solution(object): + def isBoomerang(self, points): + """ + :type points: List[List[int]] + :rtype: bool + """ + + # Logic: Using theorem math formula of collinarity + # Reference: http://mathworld.wolfram.com/Collinear.html + # Formula: x_1(y_2-y_3)+x_2(y_3-y_1)+x_3(y_1-y_2)=0 + # * Set is always 3 points as questions says, hence the formula would be an apt match + + proof = points[0][0]*(points[1][1]-points[2][1]) + points[1][0]*(points[2][1]-points[0][1]) + points[2][0]*(points[0][1]-points[1][1]) + if proof == 0: + return False + else: + return True + + """ + # Brute force + # * Some initiative to breaking collinearity + + n = len(points) + delta1 = None + delta2 = None + for i in range(n-1): + p1 = points[i] + p2 = points[i+1] + if not delta1 and not delta2: + delta1 = p2[0] - p1[0] + delta2 = p2[1] - p1[0] + else: + while p1[0]+delta1 < p2[0]: + p1[0] += 1 + while p1[1]+delta2 < p2[1]: + p1[1] += 1 + print p1[0], p1[1] + if p1[0]+delta1 != p2[0] or p1[1]+delta2 != p2[1]: + return True + return False + """ + From 9866c5576dcd2748306ba18d2f34f8e941d47203 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Fri, 31 May 2019 22:58:16 +0530 Subject: [PATCH 102/489] :bridge_at_night: last stone weight - lt easy - 100 pass --- ProblemSolving/lastStoneWeight/last.py | 33 ++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 ProblemSolving/lastStoneWeight/last.py diff --git a/ProblemSolving/lastStoneWeight/last.py b/ProblemSolving/lastStoneWeight/last.py new file mode 100644 index 0000000..668d041 --- /dev/null +++ b/ProblemSolving/lastStoneWeight/last.py @@ -0,0 +1,33 @@ +class Solution(object): + def lastStoneWeight(self, stones): + """ + :type stones: List[int] + :rtype: int + """ + + # Logic 1: BruteForce with the sorted function - 22.50% faster + + while len(stones) > 1: + + # 1. Sort the stones in decreasing order + stones = sorted(stones, reverse=True) + + print stones + + # 2. Get the first 2 stones + first = stones.pop(0) + second = stones.pop(0) + + # 3. Smashing the stones + if first == second: + if 0 not in stones: + stones.append(0) + else: + stones.append(abs(first-second)) + + # 4. Reorder the stones again while you enter the loop + + return stones[0] + + + # Different sorted logic? From 8efb25bbce2b7d69b919602e1593e5762f65a6b9 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sun, 2 Jun 2019 21:23:32 +0530 Subject: [PATCH 103/489] :bridge_at_night: alternate array intersection problem solution --- .../intersectionOfTwoArray/inter2.py | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 ProblemSolving/intersectionOfTwoArray/inter2.py diff --git a/ProblemSolving/intersectionOfTwoArray/inter2.py b/ProblemSolving/intersectionOfTwoArray/inter2.py new file mode 100644 index 0000000..1322bf3 --- /dev/null +++ b/ProblemSolving/intersectionOfTwoArray/inter2.py @@ -0,0 +1,47 @@ +class Solution(object): + def intersection(self, nums1, nums2): + """ + :type nums1: List[int] + :type nums2: List[int] + :rtype: List[int] + """ + + """ + # O(smaller_array) iteration - 30% faster + n = len(nums1) + m = len(nums2) + result = [] + for i in range(n): + if nums1[i] in nums2 and nums1[i] not in result: + result.append(nums1[i]) + return result + """ + + """ + # Logic 1: Set intersection ( set vs set ) - 83% faster + nums1 = set(nums1) + nums2 = set(nums2) + return nums1.intersection(nums2) + """ + + """ + # Logic 2: Set intersection ( set vs list ) - 72% faster + nums1 = set(nums1) + return nums1.intersection(nums2) + """ + + """ + # Logic 3: Dictionary Method - 77% faster + import collections + dic = collections.Counter(list(set(nums1))+list(set(nums2))) + result = [] + for k,v in dic.items(): + if v >= 2 and k not in result: + result.append(k) + return result + """ + + # Logic 4: Binary Search + + + From 8505dc88e9046e8e85538d8668200c9b81637955 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Tue, 4 Jun 2019 23:58:28 +0530 Subject: [PATCH 104/489] :bridge_at_night: pending problems, yet to pass --- ProblemSolving/greatestCommonDivisor/great.py | 48 +++++++++++++++++++ ProblemSolving/rottenOranges/rot.py | 34 +++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 ProblemSolving/greatestCommonDivisor/great.py create mode 100644 ProblemSolving/rottenOranges/rot.py diff --git a/ProblemSolving/greatestCommonDivisor/great.py b/ProblemSolving/greatestCommonDivisor/great.py new file mode 100644 index 0000000..77ec96c --- /dev/null +++ b/ProblemSolving/greatestCommonDivisor/great.py @@ -0,0 +1,48 @@ +class Solution(object): + def gcdOfStrings(self, str1, str2): + """ + :type str1: str + :type str2: str + :rtype: str + """ + + + + # Logic2: T + ... + T logic is S + # * Inconsistent logic fails certain tcs + """ + n = len(str1) + m = len(str2) + + if n < m: + divisor = str1 + dividend = str2 + else: + divisor = str2 + dividend = str1 + + result = "" + if divisor in dividend and set(divisor) == set(dividend): + i = len(divisor)-1 + while i > 0 and "".join(divisor.split(divisor[:i])) != "": + i -= 1 + if i > 0: + result = divisor[:i] + else: + result = divisor + more = dividend.split(result) + if len(more) > 1: + result += more[1] + return result + """ + + # Logic1 : Not caring about the order of the substring and the rule + # * Iterating o(N) to just find common strings + """ + result = "" + for i in str1: + if i in str2: + if i not in result: + result += i + return result + """ diff --git a/ProblemSolving/rottenOranges/rot.py b/ProblemSolving/rottenOranges/rot.py new file mode 100644 index 0000000..456fc1a --- /dev/null +++ b/ProblemSolving/rottenOranges/rot.py @@ -0,0 +1,34 @@ +class Solution(object): + def orangesRotting(self, grid): + """ + :type grid: List[List[int]] + :rtype: int + """ + + rotten = 0 + minute = 0 + old_rotten = 1 + + while old_rotten != rotten: + for i in range(3): + for j in range(3): + old_rotten = rotten + if grid[i][j] == 2: + if i-1 > 0 and grid[i-1][j] != 2: + grid[i-1][j] = 2 + rotten += 1 + if i+1 < 3 and grid[i+1][j] != 2: + grid[i+1][j] = 2 + rotten += 1 + if j-1 > 0 and grid[i][j-1] != 2: + grid[i][j-1] = 2 + rotten += 1 + if j+1 < 3 and grid[i][j+1] != 2: + grid[i][j+1] = 2 + rotten += 1 + print i, j + if rotten != old_rotten: + minute += 1 + return minute + + From c450b24577d80c197f7c80869a1a6a62f3fd7425 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Fri, 7 Jun 2019 23:42:32 +0530 Subject: [PATCH 105/489] :bridge_at_night: remove outermost paranthesis - 100 pass lt easy --- .../removeOutermostParanthesis/remove.py | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 ProblemSolving/removeOutermostParanthesis/remove.py diff --git a/ProblemSolving/removeOutermostParanthesis/remove.py b/ProblemSolving/removeOutermostParanthesis/remove.py new file mode 100644 index 0000000..76f0a81 --- /dev/null +++ b/ProblemSolving/removeOutermostParanthesis/remove.py @@ -0,0 +1,95 @@ +class Solution(object): + + # Logic 1: 100 pass - Balanced brackets check/validation + Paranthesis removal + # * Only 5 percent faster as the balance check runs every time + """ + def balanced_or_not(self, exp): + s = [] + while exp: + current = exp.pop(0) + if current == "(": + s.append(current) + else: + if s and s[-1] == "(": + s.pop() + else: + return False + if len(s) == 0: + return True + else: + return False + + def removeOuterParentheses(self, S): + stack = [] + result = "" + while S: + current = S[0] + S = S[1:] + stack.append(current) + #print stack + if self.balanced_or_not(stack[:]): + #if stack[1:-1] != "": + temp = stack[1:-1] + result += "".join(temp) + stack = [] + #print stack + return result + """ + + """ + # Logic 2: 100 pass - Hybrid attempt for the above logic + def removeOuterParentheses(self, S): + stack = [] + result = "" + balanced = False + temp = "" + while S: + current = S[0] + S = S[1:] + temp += current + + if current == "(": + stack.append(current) + else: + if stack and stack[-1] == "(": + stack.pop() + else: + return False + + if not stack: + balanced = True + else: + balanced = False + + if balanced == True: + result += temp[1:-1] + stack = [] + temp = "" + return result + """ + + # Logic 3: 100 pass - 94 - For this problem we are dealing with just the () brackets only and removing just outermost --> Just count the braces + def removeOuterParentheses(self, S): + balanced_braces = 0 + result = "" + temp = "" + for i in S: + temp += i + if i == "(": + balanced_braces += 1 + else: + balanced_braces -= 1 + #print temp + if balanced_braces == 0: + result += temp[1:-1] + temp = "" + return result + + # Counting separate open vs closed braces for a more simpler logic already implemented at https://leetcode.com/problems/remove-outermost-parentheses/discuss/270226/Python-easy-100-solution-with-commentary + + + + + + + From 596ea4fc889a17563ce6e2c06f34e47497efa0d7 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sat, 8 Jun 2019 22:11:01 +0530 Subject: [PATCH 106/489] :bridge_at_night: available captures for rook - lt easy - 100 pass --- .../availableCapturesForRook/rook_attack.py | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 ProblemSolving/availableCapturesForRook/rook_attack.py diff --git a/ProblemSolving/availableCapturesForRook/rook_attack.py b/ProblemSolving/availableCapturesForRook/rook_attack.py new file mode 100644 index 0000000..9c330c4 --- /dev/null +++ b/ProblemSolving/availableCapturesForRook/rook_attack.py @@ -0,0 +1,115 @@ +class Solution(object): + def numRookCaptures(self, board): + """ + :type board: List[List[str]] + :rtype: int + """ + + # 100 pass 99% faster + # Revisit 1 -> O(N2) iteration to find rook and pawns, another iteration to attack condition + # Logic: Find vertical, horizontal positions of pawns with respect to the rook and check if the path is empty!\ + + # Variables to record positions of pawns & rook + pawns = [] # pawns position -> [x, y] // # dict logic => row -> [col1, col2, col3....] + rook = [0, 0] # rook position -> [x, y] + others = [] # other pieces + count = 0 + empty = [] + # 8x8 board of Chess - Iterate for positions + for row in range(8): + for column in range(8): + if board[row][column] == "R": # white color rook + rook[0] = row + rook[1] = column + elif board[row][column] == "p": # Black pawn, then potential attack possible + #if row not in pawns: + # pawns[row] = [] + #pawns[row].append(column) + pawns.append([row, column]) + elif board[row][column] != ".": # to check if something else is in between + others.append([row, column]) + elif board[row][column] == ".": # Empty block + empty.append([row, column]) + # Find things in between to satisfy the attack condition + print rook, pawns, others + for position in pawns: + # Row check - Horizontal movement attack + if position[0] == rook[0]: + print "here", position[0], rook[0] + block = 0 + if position[1] > rook[1]: + for i in range(rook[1]+1, position[1]): + if [position[0], i] in pawns or [position[0], i] in others: + block += 1 + if block > 0: + break + if block == 0: + count += 1 + else: + block = 0 + for i in range(position[1]+1, rook[1]): + if [position[0], i] in pawns or [position[0], i] in others: + block += 1 + if block > 0: + break + if block == 0: + count += 1 + elif position[1] == rook[1]: + print "there", position[0], rook[0] + # Column check - Vertical movement attack + if position[0] < rook[0]: + block = 0 + for i in range(position[0]+1, rook[0]): + if [i, position[1]] in pawns or [i, position[1]] in others: + block += 1 + if block > 0: + break + if block == 0: + count += 1 + else: + block = 0 + for i in range(rook[0]+1, position[0]): + if [i, position[1]] in pawns or [i, position[1]] in others: + block += 1 + if block > 0: + break + if block == 0: + count += 1 + print count + return count + + # Logic2: Just traverse horizontal and vertical path of Rook until the first hit + + """ + # Old Logic: Pending... + pawns = 0 + rook_position = -1 + first_pawn_down = 0 + first_pawn_up = 0 + + for i in range(len(board)): + # Rook Condition + board[i] = "".join(board[i]) + if "R" in board[i]: + rook_position = board[i].index("R") + print board[i] + if rook_position+1 < len(board[i]) and board[i][rook_position+1] == "p": + pawns += 1 + if rook_position-1 > len(board[i]) and board[i][rook_position-1] == "p": + pawns += 1 + j = i + while j > 0: + if board[i][rook_position] == "p" and first_pawn_up == 0: + pawns += 1 + first_pawn_up += 1 + break + j -= 1 + if rook_position > -1: + if board[i][rook_position] == "p" and first_pawn_down == 0: + pawns += 1 + first_pawn_down += 1 + + return pawns + """ + + From ddedab2c59eb6be76719cecf9350b8943c99f5ca Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sun, 9 Jun 2019 09:06:11 +0530 Subject: [PATCH 107/489] :city_sunrise: playing with digits - codewars - easy --- codeWars/playingWithDigits/play.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 codeWars/playingWithDigits/play.py diff --git a/codeWars/playingWithDigits/play.py b/codeWars/playingWithDigits/play.py new file mode 100644 index 0000000..88714ed --- /dev/null +++ b/codeWars/playingWithDigits/play.py @@ -0,0 +1,12 @@ +def dig_pow(n, p): + answer = 0 + temp = list(str(n)) + while temp: + answer += int(temp.pop(0))**p + p += 1 + print(n, p, answer) + if answer % n == 0: + return answer//n + else: + return -1 + From 54b433da248e23bb1f1709dce8763fbfc3aa2b35 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sun, 9 Jun 2019 22:26:42 +0530 Subject: [PATCH 108/489] :bridge_at_night: occurrences after bigram - lt easy - 100 pass --- ProblemSolving/occurencesAfterBigram/occur.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 ProblemSolving/occurencesAfterBigram/occur.py diff --git a/ProblemSolving/occurencesAfterBigram/occur.py b/ProblemSolving/occurencesAfterBigram/occur.py new file mode 100644 index 0000000..8689f85 --- /dev/null +++ b/ProblemSolving/occurencesAfterBigram/occur.py @@ -0,0 +1,24 @@ +class Solution(object): + def findOcurrences(self, text, first, second): + """ + :type text: str + :type first: str + :type second: str + :rtype: List[str] + """ + + # Logic: Iterate and return the third elements - O(N) == 100% faster + result = [] # Result variable + text = text.split(" ") # Split text into words + i = 0 + while i < len(text): + if text[i] == first and (i+1 < len(text) and text[i+1] == second): + if i+2 < len(text): + result.append(text[i+2]) + i = i+1 + i += 1 + return result + + + + From 45b69f36b6bba6770df51f3af32de986fde5c6a4 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Mon, 17 Jun 2019 01:03:27 -0700 Subject: [PATCH 109/489] :bridge_at_night: largest values from labels - lt medium --- .../largestValuesFromLabels/large.py | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 ProblemSolving/largestValuesFromLabels/large.py diff --git a/ProblemSolving/largestValuesFromLabels/large.py b/ProblemSolving/largestValuesFromLabels/large.py new file mode 100644 index 0000000..823198e --- /dev/null +++ b/ProblemSolving/largestValuesFromLabels/large.py @@ -0,0 +1,35 @@ +# Logic1: Literally following the problem with worst case complexity --> time limit exceeded (otherwise passes all case) + +class Solution(object): + def largestValsFromLabels(self, values, labels, num_wanted, use_limit): + """ + :type values: List[int] + :type labels: List[int] + :type num_wanted: int + :type use_limit: int + :rtype: int + """ + + indexes = range(0,len(values)) + maxi = -60000 + import itertools + for S in range(num_wanted+1): + for subset in itertools.combinations(indexes, r=S): + subset_label = [] + subset_values = [] + for item in subset: + subset_label.append(labels[item]) + subset_values.append(values[item]) + import collections + counts = collections.Counter(subset_label) + y = 0 + for c in counts.values(): + if c <= use_limit: + y += 1 + #print subset, subset_label, subset_values + if y == len(counts.keys()): + if sum(subset_values) > maxi: + maxi = sum(subset_values) + return maxi + + From 0e2122e19b4666aa5f4b6fc4acae36f8bf387e56 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Tue, 18 Jun 2019 06:18:00 -0700 Subject: [PATCH 110/489] :city_sunrise: categorize new members --- codeWars/categorizeNewMember/category.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 codeWars/categorizeNewMember/category.py diff --git a/codeWars/categorizeNewMember/category.py b/codeWars/categorizeNewMember/category.py new file mode 100644 index 0000000..9370b09 --- /dev/null +++ b/codeWars/categorizeNewMember/category.py @@ -0,0 +1,8 @@ +def openOrSenior(data): + result = [] + for person in data: + if person[0] >= 55 and person[1] > 7: + result.append("Senior") + else: + result.append("Open") + return result From 6345498f6b7bc91fcc543dfdcf923d21ac4b86b0 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Tue, 18 Jun 2019 07:11:43 -0700 Subject: [PATCH 111/489] :city_sunrise: add codewars solves (python) --- codeWars/categorizeNewMember/category.py | 7 +++++++ codeWars/reversedWords/reverse.py | 2 ++ codeWars/sumOfParts/sum.py | 17 +++++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 codeWars/reversedWords/reverse.py create mode 100644 codeWars/sumOfParts/sum.py diff --git a/codeWars/categorizeNewMember/category.py b/codeWars/categorizeNewMember/category.py index 9370b09..0d84857 100644 --- a/codeWars/categorizeNewMember/category.py +++ b/codeWars/categorizeNewMember/category.py @@ -1,3 +1,4 @@ +# Logic 1 def openOrSenior(data): result = [] for person in data: @@ -6,3 +7,9 @@ def openOrSenior(data): else: result.append("Open") return result + +# Logic 2 +def openOrSenior2(data): + return ["Senior" if (age >= 55 and hcap > 7) else "Open" for age, hcap in data] + + diff --git a/codeWars/reversedWords/reverse.py b/codeWars/reversedWords/reverse.py new file mode 100644 index 0000000..1d595af --- /dev/null +++ b/codeWars/reversedWords/reverse.py @@ -0,0 +1,2 @@ +def reverseWords(str): + return " ".join(str.split(" ")[::-1]) diff --git a/codeWars/sumOfParts/sum.py b/codeWars/sumOfParts/sum.py new file mode 100644 index 0000000..1f0f9f0 --- /dev/null +++ b/codeWars/sumOfParts/sum.py @@ -0,0 +1,17 @@ +# Logic 1 +def parts_sums(array): + total = sum(array) + result = [total] + for item in array: + total = total-item + result.append(total) + return result + +# Logic 2 +def parts_sums(ls): + result = [0] + for item in ls[::-1]: + result.append(result[-1]+item) + return result[::-1] + + From a75024a60ca672abee2fd06047467b19aebfafb2 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Wed, 19 Jun 2019 20:51:23 -0700 Subject: [PATCH 112/489] :bridge_at_night: codewars update --- codeWars/goLang/printerErrors/print.go | 20 +++++++++++++++++++ .../categorizeNewMember/category.py | 0 .../{ => python}/playingWithDigits/play.py | 0 .../{ => python}/reversedWords/reverse.py | 0 codeWars/{ => python}/sumOfParts/sum.py | 0 5 files changed, 20 insertions(+) create mode 100644 codeWars/goLang/printerErrors/print.go rename codeWars/{ => python}/categorizeNewMember/category.py (100%) rename codeWars/{ => python}/playingWithDigits/play.py (100%) rename codeWars/{ => python}/reversedWords/reverse.py (100%) rename codeWars/{ => python}/sumOfParts/sum.py (100%) diff --git a/codeWars/goLang/printerErrors/print.go b/codeWars/goLang/printerErrors/print.go new file mode 100644 index 0000000..5b39d3b --- /dev/null +++ b/codeWars/goLang/printerErrors/print.go @@ -0,0 +1,20 @@ +package kata + +import ( + //"fmt" + "strconv" + ) + +func PrinterError(s string) string { + denominator := len(s) + numerator := 0 + //fmt.Println(s) + for i := 0; i < denominator; i ++ { + //fmt.Println(s[i]) // prints in octal value + if s[i] < 97 || s[i] > 109 { + numerator ++ + } + //fmt.Println(numerator) + } + return strconv.Itoa(numerator)+"/"+strconv.Itoa(denominator) +} diff --git a/codeWars/categorizeNewMember/category.py b/codeWars/python/categorizeNewMember/category.py similarity index 100% rename from codeWars/categorizeNewMember/category.py rename to codeWars/python/categorizeNewMember/category.py diff --git a/codeWars/playingWithDigits/play.py b/codeWars/python/playingWithDigits/play.py similarity index 100% rename from codeWars/playingWithDigits/play.py rename to codeWars/python/playingWithDigits/play.py diff --git a/codeWars/reversedWords/reverse.py b/codeWars/python/reversedWords/reverse.py similarity index 100% rename from codeWars/reversedWords/reverse.py rename to codeWars/python/reversedWords/reverse.py diff --git a/codeWars/sumOfParts/sum.py b/codeWars/python/sumOfParts/sum.py similarity index 100% rename from codeWars/sumOfParts/sum.py rename to codeWars/python/sumOfParts/sum.py From 8778237e6746545a83ef12a0fff55147ee8f8c25 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Thu, 20 Jun 2019 07:01:56 -0700 Subject: [PATCH 113/489] :city_sunrise: decode morse code - codewars - go --- codeWars/goLang/decodeMorse/decode.go | 41 +++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 codeWars/goLang/decodeMorse/decode.go diff --git a/codeWars/goLang/decodeMorse/decode.go b/codeWars/goLang/decodeMorse/decode.go new file mode 100644 index 0000000..8ed2e6c --- /dev/null +++ b/codeWars/goLang/decodeMorse/decode.go @@ -0,0 +1,41 @@ +### Solution + +package kata + +import ( + "strings" +) + +func DecodeMorse(morseCode string) string { + var result string + var temp string + // Three spaces splits words + words := strings.Split(morseCode, " ") + for i:=0; i Date: Fri, 21 Jun 2019 10:03:19 -0700 Subject: [PATCH 114/489] :city_sunrise: morning cookies from codewars! --- codeWars/goLang/isThisATriangle/triangle.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 codeWars/goLang/isThisATriangle/triangle.go diff --git a/codeWars/goLang/isThisATriangle/triangle.go b/codeWars/goLang/isThisATriangle/triangle.go new file mode 100644 index 0000000..ad73cc3 --- /dev/null +++ b/codeWars/goLang/isThisATriangle/triangle.go @@ -0,0 +1,13 @@ +package kata + +func IsTriangle(a, b, c int) bool { + // Formula if the given sides form a triangle + // Ref: https://www.wikihow.com/Determine-if-Three-Side-Lengths-Are-a-Triangle + // * sum of any 2 sides is greater than the third side + if a+b > c && a+c > b && b+c > a { + return true + } + return false +} + + From ac9080ea9ac16537b2c974100ce82b36599aae4c Mon Sep 17 00:00:00 2001 From: sri Date: Fri, 21 Jun 2019 20:04:08 -0700 Subject: [PATCH 115/489] :city_sunset: more --- codeWars/goLang/shortestWord/short.go | 48 +++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 codeWars/goLang/shortestWord/short.go diff --git a/codeWars/goLang/shortestWord/short.go b/codeWars/goLang/shortestWord/short.go new file mode 100644 index 0000000..9797384 --- /dev/null +++ b/codeWars/goLang/shortestWord/short.go @@ -0,0 +1,48 @@ +package kata + +import ( + "sort" + "strings" + "fmt" +) + +// Logic 1 +// Using sort by function length +// * Create a sort interface and define a function to sort by length of items, then return the first element +// Reference: https://gobyexample.com/sorting-by-functions + +type byLen []string + +func (s byLen) Len() int { + return len(s) +} + +func (s byLen) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s byLen) Less(i, j int) bool { + return len(s[i]) < len(s[j]) +} + +func FindShort(s string) int { + fmt.Println(s) + words := strings.Split(s, " ") + fmt.Println(words) + sort.Sort(byLen(words)) + fmt.Println(words) + return len(words[0]) +} + +// Logic 2 +// * Iterate over each string and obtain the minimum value +func FindShort(s string) int { + words := strings.Split(s, " ") + mini := 9223372036854775807 + for i:=0; i Date: Sat, 22 Jun 2019 21:05:33 -0700 Subject: [PATCH 116/489] :bridge_at_night: valid ip golang --- codeWars/goLang/isValidIp/ip.go | 46 +++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 codeWars/goLang/isValidIp/ip.go diff --git a/codeWars/goLang/isValidIp/ip.go b/codeWars/goLang/isValidIp/ip.go new file mode 100644 index 0000000..30acde1 --- /dev/null +++ b/codeWars/goLang/isValidIp/ip.go @@ -0,0 +1,46 @@ +# Logic 1: Split and check each octets +package kata + +import ( + "strings" + "strconv" +) + +func Is_valid_ip(ip string) bool { + octets := strings.Split(ip, ".") + if len(octets) == 4 { + for i := 0; i<4; i++ { + octet, err := strconv.Atoi(octets[i]) + ztest := strconv.Itoa(octet) + if err != nil { + return false + } + if octets[i] != ztest { + return false + } + if octet < 0 || octet > 255 { + return false + } + } + } else { + return false + } + return true +} + +# Logic 2: Use net library and method ParseIP + +// Add logic for leading zero case +import ( + "net" +) + +func Is_valid_ip(ip string) bool { + result := net.ParseIP(ip) + if result != nil { + return true + } + return false +} + +# Logic 3: Regex compile the string From 7879e21a83ee3dfbc45bb2c625587880c9bd9466 Mon Sep 17 00:00:00 2001 From: srinivas11789 Date: Sat, 22 Jun 2019 23:58:21 -0700 Subject: [PATCH 117/489] :construction: DP refresher/revisit --- AlgorithmConcepts/dynamicProgramming/fibo.py | 43 ++++++++++++++++++ .../dynamicProgramming/notes.pdf | Bin 0 -> 430753 bytes 2 files changed, 43 insertions(+) create mode 100644 AlgorithmConcepts/dynamicProgramming/fibo.py create mode 100644 AlgorithmConcepts/dynamicProgramming/notes.pdf diff --git a/AlgorithmConcepts/dynamicProgramming/fibo.py b/AlgorithmConcepts/dynamicProgramming/fibo.py new file mode 100644 index 0000000..dfa74ed --- /dev/null +++ b/AlgorithmConcepts/dynamicProgramming/fibo.py @@ -0,0 +1,43 @@ +# Dynamic Programming +## * Problem solved by dividing into sub-problems which are dependent and reused to create the solution + +# Example: Fibonacci - sum of last 2 digits form the third digit + +# Recursion Method +## * Essence of divide and conquer a problem with subproblems to obtain the solution + +def fibonacci(n): + if n == 0: + return 0 + elif n == 1: + return 1 + else: + return fibonacci(n-1) + fibonacci(n-2) + +# Top Down Approach - Memoization +## * Create a table to store sub-problem solutions that can be reused +## * On-demand storing of sub-problem that only need to be reused +## * First lookup the table for sub-problem solution then calculate + +memo = [0, 1] +def fibonacci_top(n): + + if n < len(memo): + return memo[n] + else: + memo.append(fibonacci(n-1) + fibonacci(n-2)) + return memo[-1] + +# Bottom Up Approach - Mandatory tabulation to find the answer ( build from ground to answer ) +def fibonacci_bottom(n): + + table = [0,1] + + for i in range(2, n+1): + table.append(table[i-1]+table[i-2]) + + return table[-1] + +print fibonacci(4) +print fibonacci_top(4) +print fibonacci_bottom(4) diff --git a/AlgorithmConcepts/dynamicProgramming/notes.pdf b/AlgorithmConcepts/dynamicProgramming/notes.pdf new file mode 100644 index 0000000000000000000000000000000000000000..595913b6739a31054c769c4d1475f22c8adc3b70 GIT binary patch literal 430753 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

jIU(_L3zMQWis#JBYn&mm2Ve%|9q%Uq7$ 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 wRep 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 z z;Ya#%60R@r7%G1QGH6{a>TQb9m@iMdp4eh%Nd4|*2^_913um#b!&vN|POwhEYMz5h z6!xfOCCgAGXNj(#f-Qb$mdGLMSyGjhKifXrQuAMg!0fLZoXFifQZA_Llo>lx-Fh;1 ztFKgIC*SDdPV1j)tqEq7<;bz?T!&BXuYD8bm_yaIGe>UGpC&DL7tO!WX^Y%ZPE)Xy ztSBj%`si^m7GXys2lm)J)jcYsn0a7B4`eYulOj2tT^2}mAg|2&#eN5zskct}X&lYZ zE{!G?hA$=$z*D^`_stx@%%k>ikX7&yTaUERQi~|M6Erg5CiTPG)B%F(Or}YTxF!xz zCXx1VkCbiJZI^`QJ;#RA^Pg}vrY_9OkCSCCh_4BLV4N|bP$Ji+Iu>s7KfMT}& zv3z~DP^GEEcGWlHi=n@bIJHR&`>HfuhUY|^dV2DqE=$ST*9^?aQXcC>MM@xt#;NVdIp_TBhB}O6)GDi@;IpX-eTJ z&XV|{PEQg!+%<5A`gI=5o=uB$OzB!P%V>p2eaIm1IB}FfRXK@gO9Jk4N=c{b>HC68 zOeZ!a6VMHvUP;0}u2!KGqGB_JrRO)6D*g_fM0r{2OyTkP8;oG*H<3Q>01g`ow~npBbTH5O&@6t3FuE&q}uh?MzK3VJ+iTytwL!ihJEB%^c5_r@Ovd4O z<_Uki8saH_@b(FNJ4J@D^$qFD>kkvLtGkEf zTh+)-bV1Yw^~aR=_7akv0neR=q6oo3uyjNVzvKpMgM=ims6ArA%vcmt_50k zL*;8$sYM0J>CNpMHSjn1Rh+(xbD!VunQ@=jn>uGaBu%)J~y!#!2y23x$H28j)Js6Pmm#=9* zac97{_MV?}zt+~6H#7GU0DwbE#ZhrHciBKrh|i8`yf`QKeQ-8t8e!>0AW^nWf2QUc zmp^ZSNpV}ZKvbmvkLi8;k2B2V$d;!(dfDpong;h6B1`Y}(U)`*(KEQi+{ZO=Frc-) zBgmRVUSbew1D8B;(C2;@nI@q?Rj}La5KHTf{Uqp9g>Q1dDWxN0Q+uN!Hon2I=46Ld znpK9g_Bi8Q5|*rQ6bND=XQ%v`n=^5uN+*#w(pAJ&VFs1r#>8t2n{eQzuEIV_KH9KJ zr>%<*_i2;CiqYC!MQSU3#{I2%Z|hah{`8ujZ}#!24 zxl;INVIXJ)qgU zzN?ik1*on%nH&(o@2}z0wa>PFDGPE4)Xno{+6ht`3MN~+Bgx_ZJwli6PhiCrH*ckY zV3lGSpj&bQ*zIu_yAxD7^5WEb`tVo*l+IgV=m2^PJ|=t2f3DZgfw@QTg(cYZD5+zA zO`Tf|4{NafZxA*Ab2w?K9DP|IaChZ%OF!0_`v+nKdqjvF)&Up=z9Yc@&X+|*`FYq! zC{q}{3bUYAZa^^03zzdHJQ5kGhu_I-klmvEbnsMQzzU1%6lz}VOU@R=u3G}V5c&#$ zxo?4(00B&KF1J1TggY=2yZ`q<0TNp>-$3VU`Weaawr`W(Zrad⪼f;5oY-O<=@oX z0Ns4(+O|(#Yweh?xTT-woACWx!xR~Nvfm`nF2Nrl_sX5PN4BPu$ ztVsJTgP=G+*TI}YkVzSgPM>A2$N+oF{rxWm>wk*Y|M9_Ec8+j2@-_}ohf(0DNUPBm zDk32lK%pJZS_Ic$i7&MR8@X@(Js1eTj+5E``3y2U;+8-aP0?pes6q-yPqKyK!Gvf2P@} zWDlmdnGa@#HbD*t#6q?im+Q{<9L*Uy1=<-B9@UY9IuM-K5*}(KF`@Ze+|&Z8(02xH zeYt{Mki;KTxC$BvtZ&Af@sQ5j_dLcx8D7{c(aL^4cEKFEDBpt>&z5wU+ol@9z^m0G zpjBVE!DU!^$JK0H#IMcY1B@AO1GvaUx`(aPG+z#Q6RSng#~D%xCwSVrVBCm)8Ob?V zuQJWQ|GoaVUSD652bw|sASV}?Vk5bos~hXIsWb|Exyq%*R&C$2EjY++xr5(F2d(~@hoE*-Z%u3JM)EQF z>Am}Y2miq8icN7X%O1S&DxqL-qWbwyRhX_{%A|-|nGM5BJjtm46Mr3(9J{BJ zva2Mm>FR??(AQuJ0=h!_0as?AoXKT}S#q1JdwRW3=}(4cI=2W7&()}b}1 z>7(#7oc@EPAk^nc-Cj}*nqKb9<$}eO?i9?dPkLx)t%yg@VQDP_UZ>S4clUXNvKIBk z)+ZuKFB?=Gyu7OY=X-*^K~#o0o8NW0LY)!y$4poG%B4Q}2kVX+Y1zun%B-yCNtk3s z3nuPX@K_Bc`afAv{!fqXcG)!@-i8$R-}r|ACg@mX&UA7tPM0+NxYc^N7SVvKAA?{6 z=gyycnx;sB+uZp5y_9}V5&%9;Q33#(nl`vNyf1~GVx`*%G(c@sbWtW#G$!!G$HRMh z8HXdaC_B`~NN}RUN-u$ty>wUD@x9bX1q@db%{sYBl`e+iZ zvl%d{W(_+~-_5;eVTp1@U|D(a>ek5}ufhI1!zZsCmES^s{=sr>V(F=mu3@LS@M)0J4ZlruA?0 zoutl7U7%P{-7`->7oNg=y?J*gp%QW8JGl+XBWb4VAcEyF6O5jo#Xwg3#->l$8MT_^ z3C=5r#e*rRrz62-r+;Ky`$~TwWyewdz9$aX{**FKm-z`AE*GG?uR4N_1>M{-X)Yja z{K*hRwMX7XipDy|?C_1F3|U6ftP+{_yRexPDMPGV@1YW`WEY*Q(y(JqoY>-G_JzlI zef;`6O~P)erS6>YlKU!DVmo!ur;R6c3(+y6WmdAsU$=khF90Xd%Ep_!?oP2Z56_1S znS;k4ZZ+)&EGe=?pB2!f^SUFxzcv+Al;k(i4+4_DThl2w78A+$)d%OlP08vW-7pbq zYF1Jvkg8BDZ_`Z^+PeH5>`}lUF`{uLAJaRq1;Sr5+GOm89B=iD_fuNY@2^Tf4ewIj zK^%Y6{p4C{Ep-#TVk3T`voj4_i=qh7!apTmX6KNTX_#$u=awOkBo(zt_AtKwHeD*3 zFY=4M@cVDvE2^&*P)(_1(`B>v&hQC-5B`bTX|8@$k<0O_7En?lngGha(>s`Ab(dPe zwUAGBfS4l$&NP+Cgy71g>J5xH`m%C@Aap(c7f|%AepDICd}X79SSQZ>jfLdEmki*s zfaH|(%ufE8oV7;neNx!+Ft{NYv*2{u!YvmE555d3PWV7a&6fN2YLF ze|CllnV}3k&XYi}+j8^@F@vcB10g|mnLW{A-TY2&<|Ya)oF7COx+l|AtfQ<`a7e=X z2NQI^8^eJ0WmgD^NR_)1)H02^eDwnD`g^3Wr;2Eugi~zy$;4{=KLDoiH*NQG%jbRDjF8qG3-9r& zW7k>F9U+>bL-AnEH*ZCG@dw5LRJ%YosMrXZZoB}yv8K|ZlOWxdoJ|1p2HAubkrAH0 z=Mi#%VCJR{Y0LO&~6ULnd76FiBO~ zRN|Qk`dAXEJZIx%px`;}@*#9O1YKw)!B)~CCZ75(WE0_l&s7mo?|FHL(sUTuVme&) z%)NbBur^>IP+*x&?p}fQxm^l>%BE{!F#Cd`yKH zZ0|d9vHSj|(W%}s^qtVRig!2eXd8wD7=>TFM|-pdHeedpFc-e$`Bj#ZvVR3zcbmeL zCtw%sXZm^bj=pz6-!`J27!#aeh*v3VpCJU-F3HvEb20YGdB-dC>6RzD) zPjf9I!IsssLkVm0EO|0rtn*wm_l|Y0P*5wBnvr5&Et%PJGSgV5{Im-~vTr5Mt;nul zF)^_FA+W5mwl2>$ME1>mp1`6RfO<&DKG;&Ydb5p`!!~Ng_*z?wWwNwV4QhCLC*yaI z6iF%plmPP82C2#h3f2a%QBg(tE=xgv?w`qvtzP(^fAM$HTXOZ-WC)4w4WxmV*9NLK z^!EM?<)@vwY3XTGyyT}v?dG+`3Ye%5$K+z|IXQnHx zvRuc@fKtDR{X(@kfoPv%-|}qdAU(u8!Q0II{fbft%=fbv%I+|NL;vC|I(8X;}rtx{!ix(-rvAM&6r{trz`YVb^-T`- z`(iCoBaN?W##W@~f^XppXX}DUuY?D2pqKpyv!5%hRokS${6axc#z!@0mXQAv-|j<7 zO6i~|D`zi!4$U}w2WcC<-^33jw%9ohaA|1yk;>S1gAm0^=N_p9=oo{Gk`kehyY(=| z4IWS(^VWbwU| zGa^cp>JKlIt0jm?8Bw+w%d2gL4d^Ozn0wD(0Hm+q$ECvl52!E%cQ|V)#@bV2DD#mp z+RGaA+?YC4k_F1YW0kkuOVD?-x?WX)N-!!Q8zr~rTy%@kp#c-jl0C9-+YG8kP?1A) zQm=$}h$@}@A8>-IM#Za^s)zCSQQSK9@h=(!H$~`OK1{vj+;%1U>@vrQdu@M3UI^qV zIT1vZ`uOqWhhaU;q#5BemrN)!px*y5IxhaAC&1@!!MR35bMXZawhc@9C)tEO16-XE zyF`1|h4dvkYDf&OveIqLoW_$*6^bBGeA=b-JLr4AlO?*VSYkF#7p3tQM^2g$#x7|p z5qPD7%*JS4+4xBmlbkqP;K3KV(7bxxf(FiYIBm9FBDpO*m^`~|^S_Gny(5YHc=*!n z9I&(y@446qI+f};hVA9e|1Fd7-{UX-HRJGqbR078P9MJAD>meybjL~CDnOZ!s6adN zox(r>3&R`5Ez7VIse@8Tbet!M+}C+%#DF>Ho>Punh?ngw)sJmrh{0J0Q3aKh0*}XG zw9nqjT7rHH3_@3IH2z@dpwN({^r2DYa7pBMYcH-n_I5~^KT^w1hj}smQo^q`u+Qb;#=Ijxjj3)Zm#Pa@$C0XgbiTpw$$V7%Pp_KXbg9 zz@_rjOpe6n=PSZ9b1PJH>*%apJIF;1U9yx1Uea1pPb=I#Wv@zfh;oXz3;w_*%-~(1 z1$1@?JAU<6nKLQJm9bGV1LNbUQ#GWVWNk1sk8LRgGqcWL=dY}tWbK{( zWXrvu`?`Kt2q&yq`hR~a$YvRZI{gD6$NT05@ynwK;QfqD`lI7THRETWuTPA#QoDp6 zV%iMLYvCLA8R_P75PlC8{S4mU_w+s>gFkMGoIYFlhekT`V`{}?y&NA^Rh+>*`}jMA z9{v$s^QFIg=I0sfENNdUbvL~BP)<4Vd1&2of}bKMfz42<7b_+U7~sZ%+hst}NUp_c zlroFtzEb@(s3i?VW^)%q2G98UcCK0>0V5gWdw`HM2#n==loXxSo*aaop#qfPt8$~PMY^oBm^+S@!rA6FuH=ZT2Jk-$Z8?+@MtVjF&O`dMotLelTjI=P-_ z5n2>kIs~R`AxI@a(;BGAYju}vsS(6@SnnwP*>HM}I?FNb<9dGtI$^0)b1G%Dd#v`{ z4tx*!sWDm?3Rd{N{$fuj&x9-Or_S+D^oU~w z!StWYEaI2?KH2a*=N!zHK}|#CSQC7|bcBl^uvN-lo1?ojK2VSNrjF9XjXM77CABH9 zYV?a{ESCTGfleE3zZU?p2FZp9L;_VEk0t*B@Vc=R>d=kieujwX1X9Nn6VOqfMgyQL z*DB}kpc=}9Egz>7Q8^1Z3F}+Jku#yaPx2ps{1&cf$(J&+4FK1TlHz3B^iZ9-P7hW3 z;{I`~4XIBxu?Z2;E;Zgd9c|1sk3d4^kA4`RbbQ2zO6abazn@M8ma(`B?S)t{L zRh?oXLdELA0~4;E2ir!I8(qWUs^%1FNP^Gzb@Ib(xGSz~{Qp^6Nx%Z=Hp6nwN+|F8 zl=sz8QO)M$0TfI&|3||I^@OGM{Dk)?5CxEOhxV|a{rB21{RuQ1Z-@WRt4M(v;V$GJcP7d z*JY>w-m<^>!<&J?JnHPrLpOPlNaUa3lNQ+x7 zAe<~0b|8s@_2A9$n9NQRyv~Wj=W01@xJH)W7~c*nsIj3e3s+rcmg&b+X>7IDX7ii+ zOk^M3d>KBb;!Q9|{Fzqqyk?&BOn7fEOpY7k?(Wd9s^feRzvZg&M(a~Ly7w=@*r2{O zp7Ab6Gjx252&<+3Dep@X4ve4t+ZAiFvYf#9NqJ|eZ2?i&4f zoW&HPTpQGhxq)}4p^h_xzzdenW9Kyq<<54rs{ZJnmlPokM zCv8(7=Iz*1c1B@gVE3%~^R+b1+aE!o^<}E2E17vhAXPx&@YjcYvzra6zJnzdJo`i# z!lI)tsy3}S>`PPL#S&M0I`P_=K_a(nNV3qCaY`P1Q1lLwXb_K0c4coAJ591LA6cn} zy-!A{St6|{H4$o+Q$gG&pa7)VkzBL*`hAL|ZZhFVP{TifI4D)opZx#{qaf_fwG?+h zX2M!=Aymg-|^^ub7}?1+T# zq5N5%n+De(I#rYU$0PeAV~V%M9Sk6aw|JJ-!dWYrOIDv#G;zP2hYQtpHWe#u^qcEa z;Pi9zLnqjNP++~d)ED~0@sYAr#P=YSGeABLA8&D=A$#f?Mt$o+gm~SKJmirtm@L9O zG|CsmeN5kbJEh%s;~>j-mO%(shBMa^cY_r~3Hv&9;djoc`X`BhlFL+WOS#L%)U6Yd zdbdYw0$-uU2vV5m zyxaSY@OW6irELLyNKX%w&=qZeLQ@FEAr>`J+}d$XXhL9arwM837TnmU#Gk0fX0Ga7 zf3o|YhMoJ?fzB1zV>kFbIJ9_nm2$zn##T6YMeEt|zI(HUJJU&xL`^nAYKab2K^BGz z`E8dF1=QS|LD3De^~qOjSzv2NedK2KU(=}9Ksek0BvztP4)lur128+Qs)OkIP1R>X zE1G;iCJ9i$!tMcDrn3!^CMX9^;-x)5mxHVlFd)4nM3n5;N6i)XHLS5_P2M`D@#OXL zi2YqOPW$HcDh$c)G_$w8QB*DT;YFwX=`ij|O^Q(~^OUF9z?4(L!F&0^${rUKGj;M< z>s-Ic?|~90-a%N#Af$w*Cs8&B_V8-dH;Z07%;>*hEH>SKggXR4@iEEhm>xr@=tu7t z%};yADAJA|Vhn29I8MHt&mJ@iiCKz`h;2Vo5Av{xiR->zYyYV2;SQYl!wO|H$379q zT(q<{D}k;w(I|$|9001pQR=lkow*nI+7%CPbs!9?!H%!bN8R2O5%~@whuQA+8sq>> z-%SMoJGTM={n|*PByd3jkuN~f_BSM0zq4oTusy=&gL4q~XVkE5>E>PImiS)*LH>JK z$R{&&^9H=PIfDJ-7PWK3aD6XRlhH*aB;w6GXa4{ic0!6ErtC4LYwxcKN`C$HMDW7m zJ8*R)^XJ5oA0$IU%Z;V{@&%+N-id&dq-ad{HX|vH7N1+Kx9wE?YoQ^+>2c(YCZDp)qzfgxp=FYGyv1l1zb`V-*@ z_HB=X@boRVn6ASB6SG9D|5aV(><0xyE^JzQo2f!e!au8c(kC$mX%W>Bo8KWL&1(M* z@`J9t)^HTh_wYizHDjU6ewM{&VPTnOsd-l3J^ZB}rvlPqYS#x3+Dy3D%k#b%TMvhOy2D7#k53)yS4st2>j z2qj;srHdtqwlM>1){ad-5S63rNj+-#U=4}kX;3wJj^ytX(6A{Qgog=?*O~L4))SZj z`XW)~|HA5f4F8Bu=c>T*ZL!wnrVz2K5YI;@zAUp5BH~Rr^VUh#TUlj++5?8Tr4uP> zjfEgwr>z>xS3h5a^q(`;Js%;riV)3R`(9kb@}P#oerxA8c;0g^d~;WXcmZ*4X%C0d7m!_gS! z^ezNVJ^6AC~4X%NMkN4K$qO@+HZY&aqSv#)h3Otzl@BfA{oNI(BY;PdXX8@58Xuj?^u(weBoQpmeEk^Z zNtQqkIeK=+QW9yd&9N%P{++%Z{WPho(wRa=*k>lS>+^VFmJBPyGeWz3G3jjfmFn*% zbPP~n$5it%+(q=u`uOvVYS@LI=aBZdD<9~Xp`o|zFoic0E%T{n9mCnN2<8_uY_+-4M%f>weavQF!SBdvY%FVB|=3%1YIwTlCu9Q zSvR&_*X@p8ouX~4_ z@wX)&wDMa`en*&1qQ~nFd`|$huLGO=R>RkOmWKla#k=xR{sGu^tE*q9O6ou&cqqCz z1SZh65xL0MocCm-hM;jpuH*ppxucW-<9isCGfxaz9^<73Pn?Np)or)K%IpPXgPw}ziW(C3snRM?K|usIM*I5@`~L1vaa1ASpTt4 zOM;sgcyDu{*~f9~b$pp3N`vQSp^9zza>IWy0+V8o3c)Bz1fCo)kTi_+Fd~fSyUrh+ z%+#i)$1l^$|D%3H`>}yX7(H%`I6flRptuA^@~YkOK8SGX#rODo&#?}Z)UPzd`d`bE^Ff_7by7#G-+%*E>v4#qDlcP^!UHVaRd5eu#%wmFce1}!h(QVtZbJyja zd?7zWI9bBG-+|000>Z`@3O1HWTUX7F?59MuNajsn01vWiMXTCtJET2mCsc%YHiHun zYNquAFvG0WP*BX@?U{4MxAPKaRKNgLV zY74v8)S|uC9SJ1xp?IEBY*E-ZoEtwijVtmtf`UtV0R_U_iJjPC+j2v9_gE_ zbFy3Y14#qJHWrlN=;wgq7P`R2*Rf?Kat>K`krWz$|&dahbb{yqV9c6U!MXQno6C~PQu z^Dwf0`8nJB2Dtp~_|Z-SCndBdjoKu>{dsz1U_!AmMrDDmu&FsjS_YkwHV)qdwGsgE zgEKM(QyyOSVEd@a8HPLHiu%ibfro@o`Mp}|PUNX($ihND2{PZq6m?Wwfy*7jcE*TT z&iYrj0_m-a_qO6Q&{95*^Iugm5Y{rS(=jE0f?(7GhSn zfWxMMpLYQYV_~+gcE!733YpIhLpz>}ugE3r!NEEfcd(C2k<`3GxtWGS7H5%$c3K8c zX$L4NEz=^Oq5gdzb)zg49Ih{mj=~HCAx_z*zCC44m080r9^ppWzqVHoERy5S=At z7$z=9n9GC5Y&(-o=b0N7zk8nr+mNJHtTnsfV+r?2Rom}jI4h-SE{*k@Em_6*tkIzH zFkgqZE#|mETKeEdc2!N<_STG7jmjs%-LNU4;|S`n$;@zz$%u?-ghHjqxti|Yu!P#s z0*j=vS0?c_2l=6xl!bgfFLM~3BPg6ITw6eEucaxN>g(J?CO1-MyBMM^TG|8ayjev| z8+x9q3EAx8wujC%%&;edFsiI z#AX>eZP;fKSB$+zIg(F%PM&;jcPq!2+3~YV@$lV7eSU}Q)7_NP!{1CRPU98)b{#jx zdXHu0k_SG2fsU9-7MC8?5ij}iak3jT3DQ=Ib@|TF-;|*CAiT5XY|aIxtww{G&ee})%kjUi#tutPFa%m{nZM@G^fi{mh(qHaChcXU7tf=2Ccw7m_7^*4Q!{cH=%`99DmkM8~ee z4S=J`yS+d{RiLP>X4eXWWyc14OnFVf0KbAWLPxdqB?$4@{A3F-KCtpg zJo`~*N%do=ru3=NHDa26(@Ut&x%U$7M?Hfe=d z2Uy)KqZWUtA6Jv-Pq~!uTa}}bj%N$Ahy9$B)s-t?*p9I`y%Aa6gn>ou4ZkSnHtJ2F zCOrM++=(K2^K`yol`_S{MhqG&8y`%{sF!77XE{zxv!PQ%bdy6mQ4qVI{PvWj*EN;v zs0R0Hb7(p?<)9jUOr+Ii>Db}%(rHnS@ajH#sLpo*Aq%gd<6tJM5dR)6q~pfpj<01{ zGJM{$?Ks?<_CZuGQJ(UEJWx~b@mo(TPA037%P~4ZDgnixKlrKoUPLV2aqDqg=F*og zl_(6es8gMb>};B(EJ9A+*vPT98kEPb1ad?Ce(5!P-Rdd}#e^BH=_!K<3Au8tQRA^* zxx2Vnh`&Mq?`S_Q;M`!`A&jI{!fE?dQNgJ}`0ttEJ!`1xHI$t4G!vhhUj5S^C2%@!LNDBbGb2UM4nC^$LjgL;CXlT2p(op@m)RLq|YaCe4=EV0U+$mFZjE z1Q34HU7) z%qkji{ctuwG^cmJU#$VS#PD+Apu*2frj;@t67cBqz7wbn!l;()Q*95|~gCkn`Ha z;2YJoXMqn!^tLP*jyy?pxHw*CTKsKIhz@&A2m#M%aG&a(O)oa@>Rk|tE!cQ{lsXOI zi<2%jqB&ayg97!FkdsbAzO#1;fTy3aF#9RG^c=J05NuTb;OlEJU(acnpJ)?r&s}<$ z+WPC=op{>@oZnnU?lklcULl{>pFJ+9)Xw0cu&MoJ9wd^ko-2Ra#CFkvF^{dONx>@N z-h|s2ua%y!Ji1Aa;v1gj8`AUKl_|V=Kp~;NTWpLXA-eEWSK|Udgw_R{^yF>i@CC_| z?-rSlIC&@lP?zy=P-A`w(0V@#>R*M@GkYY^*(670)$S9lY5iUipaJNYM+f{>#7$nF z%2d!(7RzdVk+D-hp?VKh_jLNTuIO_y=CJQLIoEd_zh{tiWu*N=5Ds%XnpP&ojp}FO z?NC{@jNaFk@x8v=7^b9J1PWCES~`9v<*j^gy_pHyXK>teF!4dC{q;`pbM$37aXTuZ{Wr;_o&<6z&>w zjTm;H>m?W9iAQD!Y!w7`R%j)Bjt|9&t_AusjL~|nDX<2gLwr0Pt@RZzq&e3BuX*1- zi1>T}B+$}1BZSTOq(B&61Z{TEEmg43)JtnXY?-?6Kxl@8=+x)}ghJF~eYk?C?G6WT zixOx+*K2kxOpdUc{Z2z+#SmA#uSo(|LsE3Fdzv5k`F*!$0JmXd-hci60ra!cV-Ud* zn&-cWvC2NV49;E3|nMEC<&%x z22>^GdiE2))a{LilJ!xd%!_`sr{P$249@$!`EqH@!BgQtQA3Mc5RXJmP*nq=f;IHh z*r76oCmqe3Hnh5RY#*}H;23PUS+KbkMqE?m3Q9Is((29WAY~Ul$2ys~NM-zJFzezPBxw(#=6@uTMrq8Lg|q z9B6+EcwvVW4F=*uGHSOW@oy8#%>n#A`)$cm^VY+mA*DdmTBoWGw zS(+fj!Zv=@{a_8Uh)e)gL9$_(=%$oG7QdD2wNV^hou@pr4PMKyW*=Wl!f?kq3Eb0O zv~+686PTSjHf(rn3bw1Emkkn>VUEY;zBlbMXPefxePxNBm&v%m z6&7vV=$(LTIToBT@KJE7%nXLqMFK^t|A!M zAL`2AE`Y1_@r>TCp|RyRV+sS6!0rjx=AOK3=TIomemBJ(2cZuAFB=`xB_w3zPsy zOg~710^C6MC-CL(wY^h_DaKQy1ZN%->^2}4MW-3NrAhaGxSGdc-jHTnLm8;N8223gpX`0+^U zXL~D0&i_0Oz~QZ>Yt267YLCJZG$FPi*hpFKRbO7yBMRMpI^C^80Z@naBY03h)_w0` zdK(iU>S#ROLAMS?^G~NY6hDb(W%Z>e0XQfA18@!ASWT4tM)G(h%ag~Hv-nucGC)bS z%N4MO~WOB(dN$BeW{b)amrx2 zEzNl2W`s2I>#b{8ZUC06HaoAs?j_;LWT?#F&#_1#p0FoX3p&`U-LA)u%erNb2fK^5 zJ5%2c(o$1qQQoIMQ^dC77>qUe{!Y}Wt}VdXvHOj5O~Ld5{E+4B>h4J{H`TduRB!dM zx$eQ%jrnQ*;=)zoC6(FMh2m z2mf6gSpcKXQs8MwNIa6A9@?kdn1{}VW;ExhXR7F~BJZ--ct%;CCIx5S__=zcoUl-l z++2?ul^;};)R4K|wH``{_CQB$M^71F&t|x1%tVp}YbUpYh}S_loPwE8|0|MDVbYhe z=)QXd_|K{`RL{+5edOpa!rIbRD(UkPJw00IDwEf%Z+Iu`j{_78dv$R^evYhczkE%d zv&o{&0is{!z~muGpvAKYCeLC5@O>2i7xBBGyS( zz!@7?5NYhM>wYQ{I?)+ujJvFbX`fV^-48e-jS;&nt0Ct=Eyxy7<*! zlNM?8d^m2Z_^p%PjZV{nzwIG-5p>uauJQLlHN2INzh<(wLK`+A>JQ5c?3cVdsApbt zB2w0To49T2;kH9;#0)LKmf-*%P1rX!$_; zQB@b|rigW@lKsK$OD#Ob5Frv0aji8-Wl#ksI-AE+xMr&^2U9$>x&$}&jb1rgAvl@< zEKQ_#cRAI>^zl*gt1lyeT?e$D=Xkp#2pe_oUuZo_eTSx_kjWCrp%P7I>#R`SPyBr! zz_ObU4>8|6O60{tSr$!CZ5HgfeO;>|rH3R}if2G-b zyR%ANvRQw={v4b^} zHD|Kpa+B9K$wMBN=r!@d6cdu?)rRe=9^1^U}Zg%Cf7P7-e|;=;L=8GQlM%J5Mc)CamWkGlVCV-$DL=r4|nUPFO)mEz-_B5r`3vRBZ_@D^psY> z-9^fo%;9}{j{V0A==J)>0Ga~pG!8yyNmdlVKgCFe!GDPl5ajvjm%G!VGFar2zD%lI?=dYMN)zs;A_^@GE*+IN2`@45^f*53muhzD!E#3HR2>94=QQx= zcmK^qD=g(d~|I_alW5<_(p6X^{rZi{3pj0CqEa#DqdBW_Uzw=Pn`$t?**UU z!95@3+0wUkcz7zteNSpSf9cu8$zGTuDcnD@Vp%opvM28H*qE)1eWN=n(^nYTxr-Fh zz?3|Qhv`dftzs9B%#SSLocWg!y~pTs0X!G8``|(rU0O9#U-D#M2N$fp^(G!!TLXj1 za_SHKNX}-;@|AUEV}~m1bZWwhuGvel4V?>R&20U>Q6a6?Zp9W(^sa(ms7Ej-uw-=- z;@%pA0yqi$ym!58{FrXJZX5E~c5=s$#e`j-)iHkgYN@k?77-(%23%|3%Gw&nWMwIp z9U1dkr}-Uf#FdG;C)&*QLLO6U9xG%srFX$ z_%Jb~=1;Cg{jS*ITSEbTW;~Ek7W-&Dp|vl?DIHeow)I_BJglAa@MP`8S9$GF+d13o z(RY1Da%fPQ9`k!zf|4onxyhH9Jj3zAEjR?ieTIrFWgE@s1FzkrC(T?KsfUP%C#bRD z_G>|#8K=uJ)b5kj_ha|{1=p&sxqo-x)|;uhupXf?7TskuzlO0TiahrC)L(OQE*l2( znEb_;t<2wUA`Gq8e){H+l*!ZBBC+20%JuKy-f|vUeb!Uz;>s+vP189z(j`7Vos@@S zd}XE4`O2v4?P(I|JbBdQE^E_?X=PQK<4Ages?yHDhdp-z|3lJczs-xPK=75tnAa+U z2h+-0p{$=vo!ac%0maC#1cjz}g^y$t3M=mQ&=65gCI2B<3uw5*5R#zLH2*8{LasCG z1A3peT?Q=0C6W&*vdeVOn9%oP@2Am>CgBF~szEu0`0>~Y{QY99XN7#FQTdpMPZ%h$maPO4NcJ)@(?A<70UsSe{Jv7%PG~l(tB)7 zw&6qj(7J4ypt=Y&HZS2}$fh=ooN(i&wTRyQ)xQ^iM0sI|G~gVQ#~w54osT5W)TJ%_ z+HP(i;PgukD0hr+QW^GYJQ+*ihKRiN$0?=J)w}in)u`WV?r!Naq}WayXLDy=PV{#u zPOdc|F(|W&sdSw#LMGNC*8KM~>f97bb?EsYM-~;^sX^&d=?Kx=N0dLr(;}Lw4b8FX z@{5EcE`s~(weE7fqf_jM9~Uk@IpYK?Fx*y%k2)uMp~t6LbT9T^OB7C&0M;0_4{7anJyYk}Sjaj5jHTy}#CRL2o2`+YTHdF69c`lmH zSQwYdT1B~dqbkBJBpnpvi#iC{27H@J{l454FC_W z998^%i_jzOL_A8twLqCx^3{9{e-^YO``NL;ihZuaykD?DUq51##^CNR^AdizTW=Dk z!p%xv7v^F>9@Qn*c(v8PD`jYGPUer0SDovq0!TfFDMv4FVg(E?eAoh$~C?fc)iQhpe%&F(biXq2mq-6=E-$elzE4(MOph$UsAOt*@|?*#VQpn zVwhv&ninp`K-*&P)>xN2k_4NbcV$NRa}x2!Ds@*l*U((&Eia6=2#0k?$vK9oNNr)F zGbmFKC{EHzQShdm=T_*0s?WU{(!MdCU9aiuFHrN_3?vDkbdr%l3F}+)4cojKCZQ1E z+pw&ZNuxkuX6^n%^&%ge+pR1lp!iG47RLQjr##JV(KasMX3z$?bq|)gF}c1SDNJ$k zfV&Pl{+cHj@6VEGAj7y zaN6|0So!C8XHX+ki?wGQWFuUgU+beh zqGRc(J(!(c+1)+yL#Zn1mXXA<1k+98c`3!ectbbKV@5!(fN=*B3AkA*>B611sItnPFF4ttwt6vihkvVSYB%n zO5it9T}WUGMm+3TZ?KZRI-vVgA|5z-wGoR6QinYK+E+nY)%TfDcEyvkt}vu?drxlB z5Q`aXE&4{^OuGb=X2GI?YPu}<+WPBv4!hu@wBsVLOo8SkBM0ZmNaSXf3fo7jNzW(v zRlN2z9;WKrXnT%wFP79R9#3H>q&3CbUX@Y^B(fmi0}GrHG5d}RyFpWh>@Vj0+x}{3 zRR1i#lnRCl;!vY1>FQ_*Y*D3I*){I0=_q-Y>XDsAji_x3N<(kp1pxcY&2Ii)W!{Th zPq-Hb=J5Et0Al!eA+Q5XemMSr>y-Gv!vp_YfFR5kIzYC^0Z~wi4XVG8Xc@nF@lNgu z~=5cW>lD4SIUi__MeJsz;n|fWx2=v*SE3OhZLP!;4>X@QtK4S zg>4y2tJc`W9UqD!p~srNWCC8^)S^dxGc$*cdl31)(9rb9+V;%)k$XQrbV=jXSg1-|tES!H{IPIU){Jk|xn z5(ilwz}B^%Sg$QrCD*!MCIO9mLco6j=(aq!FB5`fd0iu=9n8CdgkuXp9&l;{dFS6{ z^wGr}pFg$Fg-SyFopGI~|2+^_AzF_Sj+4ozF!(<`0{cW~>R1$i3EGldMyCsFx zj(|;JZ0`wAH-*u1+;G|r#{e`1jnk>l9aVC~pWunT<;1zE5{UiRmUL`sMT%l+sYI#Q zqpi(QDWSji=1SoF@Fs<#_IZyO7N){aqzVW)Bd4)$8roIC)3*fgNBhw>4C45yK0?V~xqSgS$9=dqj`B<(wUs^bw2$+UDlw8a`0U_Fvs#5c4IH6oB6ocI5MNAHaEBEV zL=IFa*f8|T0U?$YZjIHDXZ!kE;8Z(l3h)Y`#8cT=`tE$d>Matg% zym0;U?N9YebBc6(epML`TH0ezOo>#xmfy1u!5I_$CF+oaWofVHVG%;e1Bw*EuOTm< zds;YC92u;r=5+4)Tmxd=ps9=zIR(RNOY6Up5S z-$%elg8dzwD^bTvCFkAzcPV9tc1%YGXPBMI<2!UzY(df5{h9~nLI~tI2ah|A#|e(S zSIsBJ1fDY&HX+{WN47mP^h@JajF}DWa&%b$ssX!HUS;K#x8ADNDk_6$qqJSB#@-<; zY^XF?X6h z-Wfm1%aw)N6_Vo)H@&23CHSYW4r9})ex(dBs1y=8w8@#eGLLnXM=@+O}bN;qqEsJ?_Pj^(wQTcJ3@NN%H7Z1L z+D!YXDXPVrv#wi5wT-cQsO(6WGr}r2QyUgmLX{?u?b6hUd1x*Z*)cELL^aA=*}v7F zDu{I|(V@^ZC7JuZLu0?xb~)wQ5VN}o^n9D_FobbH-b8%DK4sr+PatM+Y*_pesTG}Y zXQWGMPu8;B^c7@?O)@UDif-yo-4wBX6nW<@`Z5CZ2;+b+*Q~CMDhP5q(xc%r@}zPt zX(V-GuRF=)+*q=}9HR-5LD)`(3wLA{^AB$Q)NQRvm>N#BJ{Xj)(*i3~G3I;S3=ah> z=8z#rr-H@Z+or5$1XcUy7GIXg*PXHGYeXlsUvKmTj{(gk&8aMowy2+Q0~X_?%bx)N z0<~D0w0r00e*j^B$LE}kV6I&5cmD-X@L!Q|08Paodeq@TKbBPH;+a>gH%^>rLP*yo zxF%;SD5K{Y-Twi=sj2M2ie4pV#=@+B?-oc$Di_w3TQ)nSycb{kTU4BjHxm8HCj_Zq zuwCpTI@xpfF(^2ak#Kj0>R8*RH6qh?1{=&(mrxmC2&WqP(OznGt$w5Rz#`9h8>0&JH^bD9En1{clMMMF=a}pv$1bTFvLe=YT;iW>cYfp9(IF0oD3z~o0>!|hEnOTB7OIYC zp^4?R;;VdTj&3eqv9}?{A7CtjV{q%BI5PP1hj&GSh~mN=!;|Feo@yH-E6TCZKA(8S ziz!f`-mt?n?x;{f;&jCXsRcOI9Z*H98Cd>2qDy7N5bCEX!R&Rqh{2_}mZkUpmrAb4%ToE&Bf1T}+Mr7r^#k z?vYRS52=u0kaM_SU>s5eZLpy|hHD4NbK6Ycm1^^AIO~XVO(Nj0d(v^DO;Gc4Z=sG| zdLY}vLF>{lT|nem+gh3r@xd%@yyiwlQ+FFWWDH%ig{oY2WCW8N3_#ScbS99(p2_vtue8(yY+nSbPg=GG08YVo z|5aOz^ZUdYftq%8=N0$G52e29q4(@kJH(&IS@2ZLUd7^++@+*Y=)w=!ZjH>`#Nx zfC6BKP>>Fk>(|;UcUi_UooSinS!C9u{O0W~S1qW?leVh$9uh~z=A*rzKLkrxddP;M z#Zf&KgdGDL?XhW@$lu!$T%K^okkmBxuSj2N4&uc+SJ^@M7W;H}@Y_{8 zI%}ut>L=^pncN*c$z*ud7-4p!2rcz~SmmcTUw$%?1uqv3%VrH4?8So6&*+13y9V__ zg`C)(C@k8nNG8?r2bg}ue9#2E6Z&)TGV=vew97X-^d%?zRNWwIwqtGjC$bsbr9 zL3?k|xRJ^M{ZM2ge7h4k2XhnO&!F2pYln8xk_5Pq;C82C7Qc(~lHI^O+@Ni$EZ;(! zbVEi=EjZ-OfnAI0AZ7_A{RkHB*{dPEALKT{Q$^g-(Ki&J*^(s;91D2_c~v}w*Dn@_3T1!PVm6PoFg2CxM zIlh;$I*{S75g8<|RDXTl=O>Mi11QF!<%G-P$Bn^nk(Faz6l&{mT7ttJOi_REm5QVH zKGM*=q5W{ibI1!u1i}>Yx7q}JH^Q4xejJKvRcwUguq$H>DAGO$74#Do=^Mj32Iq!s z{oi%%_eC)n&4-u#S7z{l5ovwo%1VE++?%#O6JJmB zAB)wm#4bb*MYM`bfk#8{ncirCAHjabF^KtPQgzC45jb5be>`c0);Y=PRCn+8+*BCu zRn1cT=>fSo4%`RN~ z3=YMLyA_JNQ@kx++}+*Xf;$A477BzGcXxM(LU4DAI|O~dyx%vo&RJ(>o%v?|n?JHb z5>~R4JUh?c_kCTzYr+egV3%>QHFI6|nkc?xDpL{ycOTq>;Js@+IE{ZS#@7sGyKJ&- zny)4?ZSP)F{bh?^o4`Lj+9aN{XHfIE#nf2&FD1brAjz+)m~9r+3bs7;{bAzg$;6IR zx2fTFF1iQ4$Lh=W0Wn&rLiOO4^Kc+lTQ|h>A3#IjLl45IZx$1Yk<={h@cdnq{U4PP z$&XeFvY$ClE-sFrFmtyVPVI{niVQaFa+x|?7Yo+8+Hk7VES!IQmu90)anHDs6m?x` z{|B(FKHRn#FM{rEyF=F8)j3nu5yIPQONt^fbKySD>A1^~4F^^qh1TCU{BgeRKCO<- zAX>@jE-8&&ro=$a=~D43wMrh=)I_8_Z1nqndT}|e4z=E*DL%2()|jgzy+7ci=|~wX zsU;-m(llriT$4o%NzJZ4T`gUNj5oiC2i#dlzUaK>!OZ&2JH^qw_BM_ew+l^8&-em> zh=>(Bb9!}*o>~``nrTFwDVJMAZyo59*7PtK*JB+|zAfeBTR)`Uk#}m%mu?NwYLq&p zYg@sC1in2ea`BB48uR=WIz1TZ*m;%!z>y>b||Ba$vfdyS^B{}cdzaDR#$J2@~#h1Rz?X~uNvbnF^NBhm_PWFSi zBzaxXX?pWB>&XVoVi#dAM~v=%!pe?YXtEg+km`gU>ntV^HN zOa%fmv58ch1^L5WRljOiGlbR26TN8}sY01GKGY=|ovUYW3u}I_EpfOT#zaaW^9SQE zw?(`ITWop(5D@5>=@5#6+SpgZ_o zvMV4Lo?ujZA@V}6hVHHYxyPUPe$a05NIo#(=EmQw@6n!AIFp#GMVY8+<+KyCJd8qs zhJIq?u7W>Z{J<{@jo2)21WL8e7L|#gbhSu0{ctD-TuL7Xeo!{<8P^RDP$Bp*Y)=)5 zs8%i?)sL3ReduQm{xc;nT3C}|cO^-XzKb`=Usli-nl4dFlII1^JF3XuJ{ z;+K;U2Yv{lIH`e_SFJ$HcQ(TU2`kv>NG)eip2B-9WbSPWZ8VZ+{4Pd@CxXdS4Fv|A zgFlJKH(o%$@lt5r^i$FaVg^}FcnAOD{!4;t5@y4Al>E@_s+WrhW%vz!$EK{(+}XMy zB3a&J);f2GvPp~ELgVvM^(SJeZUVB-mZr3entE6F;vF>cOMj5X3DQD`+-`L=z36Cw z_g*gxTuY3F@4nHVXLRzPt0Q9Zr+)a1)ohXz%Dzq@vL z?t`6s-9G;}g$Be5HjiT_N9Wfc?F9lV&LqR<9X+sR=dineqteC1b#II}#ZhuLust$} zX7X#37qjs1GkjI8e{n=`qtM~LHe(P_$alNb2r+lz?sHprJu)KYuMiSMH*DIh7vrny zFurOyXv#(Zr&~76!TOv;5Z%mPcm~fp6}caISSTu0Yx)SZyjKkWsw?YBIo4yu6Wtqy z((L80GA!Z+BYs+w8qz`)X`aIEs!!Nvy())ew3-hP%u;5&S!IWR^{wvktX}3YoV|k+ z2)omOt8Iniz~j_4A-`godU z6#)~1+Ze1~(W$IS9EiEzm??h;8)$Eey@v{1AwMe{iVrSoed3E-rL*LHon3cgmJ~CO zkR40lYLd*oyV!t(dTtv>W-IRm1{x-#Clw575W1HdflILs92^jn~fXQpsQ6i34_FSEz-0gYmM= zHdZ`r-m*D)#t~_sHi3Ni#wX%g4NHZ4C z(w7y|5{~692vf*@S}~F=7q7tXE#K%TvTf@jQTH9MM$w8c%+48)@Fx3cKC(!2@(Kz9 z6$D&%9WLkeRk9$Qi`SB;#i?$*e*m`F@IZkSNA~rE*2)2|#+-UUGN<4N+Zs*O-m%~* zY)!yHeY5ZbL3hL0Kv11tBvaZ~dA3B-YZc)g8_x9DMLljh>` zFAaCe%Y;iNkWbl1mKEHypd9X@s;lnb#5iiX(rkl9sk^rpri~=iYrw~lwrIiCec@c6 zwsQ%`?UZ?Neho7EEb1%^?YtZ|ND<`i#yf&2@*pPAx5(~!nFp7p5SYnr0a#|?==`){ zCs2Yn50VFa4*1ImXR_%LWiAO46^HXM&_v8VIXHK#n{rK5&_Qo^AGi%mp0ixODFHjGTG{ILXFGqyDA*4XR@q@R?pay(GEdgl` zbbDzgi{Oz}!m;fYt^+3wZ@m$cw7pu*{m6U#IrEP;=T?Dfsuu?0i9p{xpy1{Da7>2` zSHcEWir``3?7<}-y{~1XfqDIBg4il&&1##$+fR5Md5CZ z^&*o5wCd!GW$qNEqs>8s3ixNmWoi|xV?=PS4u=9!uF7A8p%42#7m4-9Aq4nN4Cb=t z=wzQ?5o7c6;i;gp0qycCE?#DMv3i#r#6X9{UKsokJMv-0>DkeZQP(-Vn_JG6E@?=l zGK$s@ptRj@-7Lxx-NgswxGZWA5wC`ZZosJIe)(S!VUon9p7eYzou^RmC7RK1JNMr=K2u|Zm z6Dih$0~e{btI2&7h7^57*vj?otd&y7TAqa?mj;rs+nOMak(xCwN-QvfhMjTDA|=x0 zH$TFZ3&PT!FCW|FJAAdSB5sx_T_z}0{cu`ps7tDo8ql3d-X^;kFPlN0_&2P4&wLp> zbmR@#wZ+YrW(A7x8F%y66J*zzOJ@$^VTBWp?#ngyHgI7Oj))XPI1s%GnnJIU)i-8q z$}#r1DjQ8zo=$N6a2m3u$k)N)z5A-wC)B9leuO)FY^m)L$%{IPN1n!h_Mw%S6&agg zB@iM;3*qQOG~BdpmJ_Y2|CrRAjLPyMQ_D0F`VKFlBf!4?HHUS#7Rt39ogzu?^YKRw z@qzAMQexTpYAzHO;Bygla$f&Dpgt#V1rA+FKO20VjtZUhq?La&oSd+4ozk~s{iR`X zSq7j0!2e3TH-M7HHFgNjQfYN`OdoL)+)~;_q^^zQiLRM3+>irM#i`93_WVGkV`t~W zlvFT%MCTZ=$ zLMU;eQRS1{(|Aznr4vFi%GPI%C$;mB2U=Qkzy?cOX}Hh$7b;2{B+-Yr)vE%1GZjfb z&HZf&IsWKrK4%l|!P=o@6P(;NLP%cOev2zQ6%-2nV&n_#A3El5%Y~1&4usgL6SS2d zbkmZdn#{3d+{TOBk1y4w-eQ7K-!i*RGBI(9>h{8uXv%e*5F zL|FoAv_L%L6y+7s4Q3N)x*|pQhTDC#;PM^vUq*U|X7$5znKa@u$~G78p6)E3C>@{W zf#y-)AXZTQ?GGGxua1GEp5zJ#KWMTYxd1$wg_w;R77;={AKgcRwwEwvaX+k%Qs3W& z*T@RdGhT&hSy&FVQZ%#VxLwdBg&EZo#*HQ~!S|k*)BTDP(1hz_MQ>x1&7;&34N$9a z7UT7xVMxEQFy0h@sN^cN_i|kCDw|*LA3*4xuZJJz6$Tb6U+>z4Skg5rW0mF-Gyr|4VQ&d<?q1Eb=V``R>S_>cp8Kjh-M4MDCk(I=Gb2p zktuU}wki~)`N89CDWUtrNsxVF!Z1=v5Z+GXKymct`(5{4U|5~#25iG*`fsrkMGy8p z#lBuYTcZZ0?)9(S5S>4w*7!bI-x^VvdDBq&Bsj6$T)me=8KtWReyyY-;< zTkRt+3icFLwPl74vqKeCqxg2Xbl#uGl)PJ3WZ_=jSdKn1{#I*mp;X*~b%VvRJ3Mz- zIPiUbDm@#XrLdYfTPA2ovz9Yskuxz=tM-oUv~1$Njc=j><=S+3k9hUN5;u>p8y!I4$ ziMpTR=}USdtQvex>8ED?drYE3nHScJTC)Z;Y$YL zp90Cmt{xu!AbG~pcE4sX+Wq*Tdugb8l^x{xPg8y&dd7xhg;k7+mPkq*9XA2uO#}bT zj07=3_4f3#G3+>x%3%O2fpxMNHmXa$8MrPD6DQD9PK0aE@@l$|ywh69xYxSU)BT+E z1)kM)m^9+66tSizF#xUyA;c(P*E!r6JCN2$-;R=NX7=r1mIvQ0#wy~a&fAd<{g)+T z3W7CawmE}XjuerJuS}HKyBD_0hMBd$Z>04JKG`B}6Gb~;J%un5g_6_4MySK|19@Nw zmuf0~8ONQo4-{X&fSFd^6o~0?adpN<^0q9H0S{HzvE+N}s}$3uGhJ{mlz-H|)?QYE zeygFA4chk)D;8}Ru$&W-To^SvJ38AUdfnI3aee)ziu1Xw)yGyO8I*!rD_9cLpp+&=By z81mt(dOiG~i5CCub(w%Yk2E5p(?;g>gE!`8k=-3vq!dG~s+Tt`7fAg-5Ise+@YwPw zrnmnoyhT)1n{<@EU?+R8JP-V@wEugWYNKB=JiInEhNrNu;f}>;Y%^kzHVoiZtCi_Y z6wVCLx7i1mivy8~qX5x2XHF_~z=+}M5!CLczbH&mp>zGmI`nu2_p${tw(6Z3-z17*3ZPBE1}@AfFSm>R1IQvdr^5F{Yp9N*WSV1J z(a74AZ@1YXWceVF(yOcER;Vm=23p)dJiXY`H>P}1f!waE%{$$WGwyeG#>Bjv8ETP` zaj~-LHQE&|zk5xmQv<qNT3Kc-?zbee#B0Zv^5f-8XJjKXwCpT<+M!@7pn%S~OKBaS63&4=syea8U%X ztZ{S*JsTX?`m*dOA}FBG=V`4yo@F#8f&9&2`iYuuupD%K`%G;fF;&lY!TooT?{0fe z8o6I`>?;#~A-fI>d-rdI-4pR;^=F`@=au@9UU&2bO|O)$Yyzi?5hvtvN+b7V|7wZ! zDXzbZVg|_adj)1!TZpkNUZx-Um6%5%N4HncHEKnd0gHm;YfoKLAGBr?Xjy^fXO+C~ zom)h@5;?oXYH%YWJWS0MBEK@+Nm2gLk{G?A?!%&`tI^?zia}J06ueW$d@V;AssHvU z^P>7Pa{#Ln609|e!vQ6EtyvfDYjOQ!oM_^^rTK>5hMqjx~DEBf(f5 zMDF%GU_1rP{nznt4p|#JvX$v>`KAd1YO`>yBcl8u3tZ2JLL$WK_809(azxIPbmaRmpw;3uN#}3~s+}?%@>?PC*R}pF6418y9VV?}iHYvA(QKk{< zB-BTVXvx)_PVvfT;KN_Z_-DD3H#%t86`4F#H%~@%FU!JJ=H9dCrn(p;dmV7#4GR5)qo>)X=kRZP zR-9920^G>a|0+HR#&UX*Z8}|Pj>0=5yr${BR;XUV8J1QFZaIHs?0>!HiMVcWqP*}gvhn$+6Js#W7FL^QYA7|#3l)d|D0@d;3YZ3A3~`v@c1RgzoDKP+I{82III7-MB=^7XzMghzG%O!NwcTwQI}A zEnozS8uw}7v-Z*(>t$5ri*rF!%ub~k+vmxtvpRSZVi>0Z#LbBqKPK5r`-^W1C=6BI z+Ke~~q6#<7pgLoa$sT8sccr{wlRl4aU!|Dxr7v9!EBxqa{8-(qzi7BrF&zmzwUAgi zN3SThTaPPJ3K$%cW$n0Ztm6k|Yp>_>L%s8%FanA5))~<03#qSq3E6foU*EUPzcNA; zbLk>@#=>t9VT~AKJP~gqVU~&x{o={ zxCRj2J^A4W^1gh9hy+|-BSYnOMjveNn-SC+RJ;e4ai!@Z5>REvEoF&Kd{Bg5MWAF9 z6~?F?bWKWhpraWs+BZMWiLf{L{itmvXyqjswk9X!#VfRXZ0ZQ(umr}EDtHS{laM9X zApD{xhetIbwu4EYM1n9o@QR@P!V7aq!D*SxBAsWfl}vq>O~J+hCvm-5PmR2kw{Dmr zWJmT^kMVcy`<0jF%d_x6^4I#p=A2R7V{OQO%fZvEuEdj-3Q}OIclDHVd`3nW*(=Pj zT}6`1H%C9~T&0@;9}Yg91O;J#N1Zk*D$7z_hJA96_<`{?h$geKm|Wf-;yJQy*!T@S za&+d2dI5A8-`unGBzhS@`KcB zS=?$!rbkL5s_06r$qrZ2=%nJCrps9~dJS?7hg6&cz2!Od;BF>x%#wYjiUN^JA+&PTW6(L2#mn%Wol(ONL;q#Qy<*(P*T|09L}Ratx~3Q_(#=r`Maw$bM=ZT zoScgQ`!-nKq&@i1-U2T5O_92u9cF2_r#4OUDT@oTle9=TKxjA<>ZNd((EWZT%_4U2 zgsy`*v5b>YjFRa7SM(^^jz5)I#JSaiL>iDJQzFWU&ZEF5E!SXXn z4ts?Bo;#!0ve}#JZ;W!Wp<+3;Rn;90Kun3&_R_({f`lcs2o5rK1xE@ej(O!`qa1<$ zD8^%`nU$kQ-!!CPx6nS$S>1DGNA?I#F%=Atjko6W{iG~(W=dE0G8J^<(r|kDQncK` zHF3x@@`0G7S1iAZM>#z){r(fVYHS%hEu#fyx>12U7=UHXQlDmsOO9eLF?0TVoW$*Doj2P`L9vdEIi$7J3 zos3dVFniX#j3Qa_ePy0iBDX-MQkC!9w*;xi7A(q>e7DEV7Zp#J;6oYVs?rkEvM~c`8Tf^c)Cr_BqyDtrh;R?d2HjDa;4Bnn zB$eUljTeUGGaRH~PHJ%qE0#&xfFbwF)eAbg^k0v!%}e)Bl8wP zd@R>Vhy8+Wx=AQMJ&J_`2Czh<@my~xJqpw4TIX!xhav0JLS`kKO<&x>vvKI@SulR# zPtmo_UP+k1=zaP>{(SY4w|oQ8p+S1$4P@&OkE^L?#kT^ z#=vfb&PC!wKNV5_9h#N~Q8OO9-uy0Yi5ZWITu@;1?{x>mvoVV)5(&(shU~Ww30mx0 zjyoVtss_1+<_ynLW=~*Q(nnrJACUL^K}FCGO7#(qI$4U#mc%ZSs4?RE()Dl^Zl$T|d4+ zP1zZsixQIjknQKLs%LC>BSb_RloCel%%yai;PMGXrN@e9un7YiZi^lY=iLnv2NHnU z&YNhR>z8O{dE&1l)Ng5BUm0s2b^mP5K()x#?S{v19Frwg3|KR1YDZ8&HycGMhO)!Y z(P=^`WYd6M&=#a-&2et=cU_A9Yk?dw26CX$KY*NXDQhDB9eKqdWDyv#l4C|gPd}+w zi#%*olnLGVVoRnWz_*}p@MR{eKTFXhyB8NOxtF%sPa{?P?@V!(+^b+7uxJDJEr*r* z=G7SfRFW7rHkiAL`?J}xB89Mj!z=zy{M~fgX4LD*=a!2T73%qPmjgnE79`iRIY><_ za1uC^RZP;hG^A;`9xS3^dJ%hQ#&n7X(`8DUe~A@;*K564vufVV0Ck&u0tM+cJFLWg z`I#PXaTp;)IX66hU^~Zc!mbm6K%Q0Dt+ong7kRR(eUWsoG(4(XJxVF;n9{b-&S^36 z_uIv<^g#1$oqxj*BuIB?1E-U;`G9^(Uk2}rUY)6pH5b171v8CsX|Nmfe2EpTC=65O zhQI!uM*$FexlxZkAHJ&Ivy-u0>(p84YA&!L>~>tJrm1aSBbvzRV>15(uT1x(?kOr^ zOA1_s)QIWjl)oOFiWPMWoCnhD168i(4`1jOGM+Xv38@=vQoi7W+TUy)AKy)$wQw2v zo0XQcTi0YMsGrNd@d5>79~*9}bz@Y5WwHumL;))9(_Jh&uwLP3Vy#`x*!kjsn8QdA z;S^x4hjDt5;BqlW+-e=gsOGyi)IH#1=L9?OmH&dR)@N#1Tzot``+T|)I4BV2GFzDR;qrf%{)BeI8 zD|g#o9?yKp+$W2gv0|Q$ltn*QBXklh<79s}9d1mRIN(#&K;c3`JE(=;wKL&TkqyTy z+{!3NLh@1WkUCW3m$f+`@4Z-5PdEc9 zfO_64!C{XyKE@C$RXgk~na) z2F;6{+`9FlAhY4SmE8_V%M4S-%?W20+A3bCH12v3TJc-N4fRl5uN-ImKz}EJ`F+Bt z>^WHEp+iM5hBIs5KML4wC#_YOo(?@o=WbLIwA>hS?T`+#`%B z*?p1kAYK^o6pQnju}3uos(m!YO5Lwpe1hDy#BejA1Gtr#L0(pZATw_Y-x?H9w-d zysg|$rZp|+d!Ue(wVQU=?ki)QQUdA#r$}`0;Y9|+u|D0KM+3!oS5Hy?eqG2pZ>1W3 zYeReduPi2H&6yz**$0B1H`LdhH*y%beDgBnudCtDrHROOtLzT19VrV-DL4hp3YiP^ z+{bCYGqXPk=_yjM@mfC~{QhLe<9tK6dD8ymQKqb5;K!C(cw1#Z5Qu;I0OExd`hb^|0vW3z|g=trF;-?%%qu=h{#-F8oPC!f^sgWfk(Q{qd zOnr@7ZFXb6BQ&yPmx;pIKxo!@V)+vyCGnDeFKa);O)aUF&ezE#Y3UBV1r1|F> z?_7kw;a)i>HY7&3O-{}l9Z^aopspk0lKJZCj7NUngl+YR;Q>ce0cmoS*b`Wvc1k9T z^rra73P52G(MPu*%DbY>{*Gt{Te4iYSMmJS2>W8Ys(Q3GBlpV^i`eApO5r{l!I2wt zBR$o5`x)IQKjKT^QFSjvepi0;sN|Z;B z9)|RwrO*lVgllU;pw}dMAkaDTvaSfYnVaLb$+GBwxIdy9;_eqwJx@yWtCymW|7rJL z3GM~c_hC@K+};^*f@hGrU-897tM_?)NXkp=Nh!zC_5P<1p}_L~O9y5v3h~jBHp*4t z%7$^&O4~$8NW4tod85kyfnlNov#QS%S`cp#uUxs0dVe>*7?sqolh5kK$M2=6ZNLuE z+87BHk|gS{TaxFfWqR7Z%Hb=95nW*CZA1PYVbumXS7-9;+9|mdIRu_;@D2k)NHC!4 zuy3JO59+Vn1Og=Y!~$*+VwVyYHaPBNOQ!-=LEs=gHAlIETR|3Gjg*ANpv)0ln2kV; z%BFedm{dFR_9uFYl6e-HAZ@Y|SGuJHEWQc3oz~MSFZIKg|Ljj6-8g*2+&d*j2Bq}y z6bV@WJ3Gk7Pv0(BknKw?1?iabCoL3RZQU1cmgT)EB>i46*&e?TK#`;Q$ z^CJhiYLm{!?kg*w9FQ73V#Btbb>3mWyGg4P8pkj2j4y6J-jI#P8gU|KkFuCAPLkXX z254Kf8G#+Keij#KE!_XDmBNt6!NE7x)Bpewf>GpWxPFnz65kHW-21ra#67xyJvhAL z`fI)xWF{Acxj&&Ix}W5VKNV{cF4%wOe#2nxb$S;7E1tfI7R!iSR$wD^6WHkL zBeT*fNuq>I1=yO^H-%AtlcW6Ps3M-uV5Qw=X6Tdux$e3P;!lb;*I@xp4;I{Rv;JdE zU)+3!{M`*L(xg{f86{*1Ea9)!8;Wc)Nt)7$hLBhYPb?!lXJMXqB*(X;ooLQ{Xf%7e z#k2Me2c?$oVGB!zQ63W4{wB+-kGn+0kwBnOeIG|C3j~ zq>bc#i`O}3a{QY6pcLB+=j-JwPhW1j4~DC;Ahdm#3KkRvO$eX^a?RbbAbMRpI}{1P z>x58?jhMKE?+TOj!!1?{%49Bc4DgDDK3nJ$N@M)$)Oc%DS6yJc9k8WO(0*6g?G@1$ zz_QPhxUz!zK?M4}_fyr6M`pxufUF=bHytqHMg8|{-5bexgF@l)Rjn4=k8SGr+<<{$ zp`#R(Zi0@>#t*Y8jW3Ijp|0!sC-(X!=YK>@gQ=-9Wl!#^r@B|ACmmnxw_lBfB(fYu zf3LJ+{U(Vk_x$^(r~??xL4NQ02K6?TH*E(0JPphk z2PXB%<3BRq#$*x} zSX#rQ0n~$KPrkj)B)KeHd!Az2MZl*zPi9|%%+eRloGFI|=)0NI(9K=EADAV`cT-n# z+ZuOeljGz*pPO8Sx+a7p%#j}PR~OO)juglEm#TbjW6~*JW+yaFoLRBZh=m@e<)^{g z^R(@&q)S`Bpuz< zr_-AwL*h9$Fo;SOks(Nk!xIr~wp>pyi--dOksrjZcFGH;pPm7Cv$+XZhfDaH!xTak zd2>$RDb%LbZ}Qq~TEDvpl{CFRti2m<lpL> zdn6g5(J9xXL8*9syQCQlxFks!5|Bcu5{78v*dyY~H`H0@`0*#snd4wc;o|-u74)ZgqVH*58z~B8sAm<2XIKE_Bavs{UpA+#oj4v%gZqDbyf(|&F=`~pXBGx z;~{!F`S?{VX?<%~o!>VB^QQJbwc~Y%?1#*{ZbS*e)`j+FAXV2J^2B@Rn5-R=RrMHE zvcnjY5zFa^xI@AF${5Exd!t9gehURKN|XTolwAOWrdcI&DV?b=%l`9Ab3B;Om*7+jrmlZLpihC$hY#7yu5O&fR*WN z#kdo*axHx>?}=36xNKhuG4a-0fZZ$pBiQvu>_FXS#Xf_(r;do&@gD%cOqcD#ie*Gu zcvFnI=3f-aTptP+^{f1={LBX`k@iel8Ayh8%eD4|drK{eNRYB!rpGu^l6;LcxiyN- z$h6*{g9KYc*x=I`AQevP<1Ha{-wrXj#hDcx`THhy9UW(>hv^srq_BUpX{Wzvm0i+% zUp50zl$<-yqThG*BQ_MoDN|cc6;BmUWIFMjE>%Fo?||g9bptt3^cS`z*^pJul3E%l z88!YKAX>JMA2l%+XYWX^0RJ_Vmx_7I#C)X)=PNQiBbB6@Yc`~WU~JXG&c87~G+vgD~_E4Qem|&~sn7lsPp6E>w_0Xn{#* zP?-P#6ITToU8M)ckO6oV&qyHAqZG3Jf7jHkFji*)(Vpd@*26(KRUHVHR+nGDl^1XF z{>(W0h4jPM6eWX1GZW1`NoZw&4WagS5T;59{coh)@c;F(pGp-u${G;fI8)#9^0#g z3*2lMm4s4X5o}qBgb?P!pa)$)B9%G%_0r>KBV^+I@;xw$I@;p5t~`#v*it0DzM}P? zeZ6MG5_0B+p5BGy$ux$r^loJb{y3=Iush3}0LtZ0G=2I95Ke69m=tdR$~8yw+f2xk zfw`a*Zq6KW&!9U?@x#W#{yd!k7AmUmI~dhSKTz2;XG| zMK2L+zBK9^*Gv;x;p^8!me8iM1V0E4@dN{=f$ke!pd?udOCbc55QBI-4;jO8X(@{1 zu&Hu!wvcbhPGmOmoI=x`l5|D}R&rg6`6;qJFMevZWp(2J%sh|2-MfzR2~Lx%tL)3T zD*D8mM>x;35**h}S-&Tm*mB}Bk zgBi-FTV>j}?Ts>m8vX%+dSkk~DViLi#Q{_vA z?Nk^_iQK@Zl)s)1CV;*vOwk4@fSlfczpe-Wuv8*T4vW3Z0}%g3vN=Sjo4*Sxehf0S zIRtW*_=Ks?I9_xp7ShL*jJJ$heMk4)2PL(p6KJFe3A>?`R%OA^44?n&RQgZ1QCB)1 zc7B9I(Y5un9~IwYHsDIIcLEMN(c*nC289#reXzB1G{i=t#+0}PN<{7DgK$MfiVZx` zgG7ROJpu{;0VKOC?tyPT_U`_ETKr z4TTiG2JycJeisHtQ=78_&O|j<` zyY{~B)E;X>u-yVdBkUb&hra#U#Np$J?8dTM;FaOB``*l@tEW(F@b#Qj+O2vRXXx1t z8@3xIDN0|WypsYNKGVPG&c7I1mqIxP9w5i0>A}yAm6PL{mj2!*b+kN~!{bSz=v;Ji z4W=sE%LBn^3;<7F!6gh|&q`8EBQ`AiXOFomTJAxc*}PoYMIld6&O|;69R`NhqTb8N z;c!G1vW3t~FtbT~Yg6^+F-Yo^6ov{5cnP zA$$kXZu1aXP(&bw?5RY{;+^8m(r4+dmLA&zs`YOmtcn2uCvkOl;J7%Ri1{vBhvGKO z#9`F9|CYn5K47I%&zRIU5e@)oSQ@Y+&klI>5SA#XuIMYDJUza9#jYu-!1Ny=<%qZ~ zz3YB&G-z&a*It;R9zhxG&8qzFUtA-7m+R&5nf2xKKrXW~)~KU*vHrSz&C13a;`Q=s z2u$X0hE#+9(x2TllWk4vmeOXtc#JYXmsw2>oxbA6ju1m_y~3q)x5I5))sdt>t5bRu za?BT2{UYqv-gLHxj$rT)pyw5PhuPMCS3FwmW7}L+=GzF>2@i>i|YqU zaqf2pq}YwV;)C79(A3^H%4RVf2$kl-oqq%5G#`P9ypFadMQK%oW=fV~6o6+;^kRK! zJVZg(lj>8wW1OHkQLl(ucjPs3g4ks}8Twv|@DA=r2nn%qhfl>3td|UZ>hBAco^v`U*cWdROb^zj)s*NBMsVj;>qnsW z0waoWnO=goDu?6I*Cxe&6;aq7b8jbqb!jN68SX3P+NIm8J$AvzqP^#utGKu|CiwD6 zB&&W?%GJ}A9y^D;q>od1e zuld^D;M|E(@u`}@!$ERsy{ESq5!<*r2Z(lQ{PtcvZsh^wA$xY(AzG>vO;aDUR5x`& zp2Dg4ON~>tsl+^fNrfonR@0hY|2eNOma!Dpb@n+N<{;k$ia>2)2ZvmW;N5%L<_2zn zM20n53)6Py`}$x>5+g~H-^}Md)-N*9*UOvj^sU*upPAKsG!30ODXeuv72FsRnK**I zEBda8?+eHwfh54dONK#5`2eynL|)#PLzX%m=3i}T5s_^soIm8Wk|0K&!vT`_#OpTu zUO((gD94FW!<3;_%@yOq{U4_zn5HN^nEf-yOeF9Mi?= zQ@mZ&>THjw=g~~7ltq0+8>b6wlEIpw$i%wTU?kHIMICPS=^jAn>mrzcQ8E#rm8;La z7{#ogxK`;}AE0O*;t5OqGW)By*ouWhli-l*-HQ(x_XW>%7r*`)uG2QXvSU+toJ)RY zH*jw1bL4Y=^^PA0f&Iz0Gp1b^osHtyk(T@V4~;W!Uq)jaLBT1mY;r%feeY&f3I;vB z8}SIL_j%Bqt#V}|DeKqVMO+2)j1B9b`wdFkWcNjHI{7qQTNv9|d3=KH@J zOfzR9U-C9So`Zouw=#Jm$wN^EY0^STWRYa4gC(oe_>6I(#RIU+RY!1G-rPk+gW)^6 z410gM4aS3I=ldK8b4~@R94RM%VqVJ0=Q*}U)DKC0 z*Lq{AA4Xcn2tP}hCMPduJv!f4UQM1A#TUVZ7;|+w_5+X)nol?wPc*%bZLX%T>c zeQovL-Y15hE|eKDDySW#-w(4*iX64eAvRCsI^x}ptc*6$B6l4H@Qy;5-ForqtyAI8 zISk2>0{@@Z5&utr0~YslHX~rd#%_BbUQy)F1bipiOte$dS>C)YY4sQ!9pf($!3!9TT zw@o~_AsTV|SRUrydRX?m-?Ax7E1+l{i>v#_(Xv#}uO2oN@OGLx|x5ev^L z@aW}xy!r*yg;dbgHMT{XVpioKW#ICf8Ny+$#)X9q3GQaSdbNZK|HxvJ)-1nq-km<( z-?67~R=ElatHgZE@iIC-KuxfWn9`Hh6kIE=B4SGo=F)C6lGt?*g9Oq-*%t>!E9wnC z$dIT2D^f=UPm*WbeY?bbhVt6;`OzaX#VU@M#YtOU{Vn- zPhNGsBLVSNiC>0E@RAI*f)p%R;|CjdqCvA$~FDMI*nlV)z zYSU9aQp^d%2}+2;JIz%0zzDvP7ZDMuL!(b9%a}jK5zojU^C*2Pb7ah^Jcaq(OD-AC z#5PbaC%YpcUm8-#+^!#+p6~11iF)Hf7ACp+?iTYo>h}{@b64QgO7^i?#WkMDWY?qS zFmM1Y{mQG&`&5eZ@5gzd!Kx4UAZ8NgtuCn-$-`1$`fBepOz5Za4?uSQ?z_XCoZ}z! zzm7|9jU3uudd*)()Q7;tFF{4GWfwbCks{0qlJA?!@$o*@Ou3>fsknz$XhykeI*U<4 zaU2%apix&vY@bbniEkgpmQ-VU0R<@|yKl>E0iveQ%rE%$Av7&BR$ZO|66^LBjHUCh zYSOJ@V@Td!R7in%wlx)mZ#c6#DkdanDPAvnDyM-3kl9K2v{Y!~KeNx<_#E(sgW4f+ zOl*sS<@71c`mii{u1OH?HZ03fS)d|7J=4ANOerCpMz{V&-XO z)B2i@zB8s`-{E%6ZOOyfTWsK8AnPwJ(Wg-TaI-QYpX(Dx?aXEEVvsz=HR+^1Ooi5k z3Hi>WJ2ciKbh{GK6`c<^R6sN4e~et9O9d&_(mu{?mu`)_6a8PnwVVDzNlr+S6OG*T+TL$^60Jf%BuwXc^+EkoQYp zzu2pREoQv9gAu=Mw=DrWU2P85)-b7obNdHC9CLGSjaa#$h^>tORn4VQWjP0;4FY(h(uT5fjo4pKhhD_7w}HYvGY0 zoX>R@Bi{i5LsQ^`NLBeg9oH8{NZbX1w#f$%B!(_9VstjLc?{j#rZm|=WZDlPH)$iw z<7dmvi1R9qxT>34f_~54vj$3jn|BWI{3vD|8<<4_6wpT>Ik}0>hYS<5xnMRuc>L8J zD@~FMYknp^ZF~w*=7nx>-^hPFj}DBd)37--Q5#f*@11rFu79yV$LU>*@bJiLbLi^uktQRc=apqyqB%iv&6B^cmxdI-h@NFo zBCvYwVs0`#oJ6vYEPSbMy^<%rQVT)To$waoupWSiwV#G=Ty)+5g_qAh(!-09H%^y- z*>>T?S=&>h9Q>J1&Pri!v;Ox?C6TZFOsd@~>9Bj1TJR0LcWdLph(6up!I(~W z93PC|Ql3imXk&xZ*@0T752H7**R&Kt>N@sVB}v*j)^yO(J;Zrvdn3GKQOxKqzSe3@ z#BzU^cz0^ixCVQahVsCELtl^RB|Rj_sxRlQFhH&p;t%BbL8y@2cdn0S0$FT;@0N|pYXjD57$4RPEC)rX^y-qZK_CteOcVGEG z`}q5W>w)qIoY7vn7V-Z90I9&+i<5`2sIe^30UZPIul=@9QV(1Gh2?hn7_}lS;Cx{F za6F@&$fn<>@i|UtqL8!b6_nV$Cr5!r;kBnz3ZWT3*(bad+z-Y*mn>O&C8Zv8#1^Mk zBKjl|Di74LXo~N68W1@=VHnT&1d)E|UEtlZ(!IRoC<;xN6VTEtNSPrJAAT7X$paiF zaoLw@yY>qCnFL*HmA)GZ=?Z!-zufe3y|uO?(SRtT%D97`4>WPBo@+kI*95~czkA;K zzsiGD!L|LvN6U*!e*1hs4L;Y?k80XtW}cSPI9BPhGzbii&vZW3Kddf(en-#?&gya|MCic`_;oA zxPMK&W8>9F*AF`C*2{9j$mNXm4@se}u^ZSk?faYN1Vi)`OK#JNhwB)OSS-hO^) zOv2#4B|Fdk8#fiAwI@l87;bp`v*f9y9k&BoWF$qd zO$N7pP39P?)=UbSua>}~DEU#wKpDb&Us0bXZhuMOr~%}E_%1B5$cyS<>Ap7YvI;Q? zy!|LP^g~!Y^)q#Zn~;$^ zPeuQE3pjc`^71C+Umx8Slv}pl&D0(?BKsq^ryIcP7 zAHc3&eQCdqf@$pDZVYXQW0j+pB=oQ;l~IEg zg;4HuzTH}h-#FpEF)w#oBYQRf0}vlO%~V0hwXGR)6b&M9_x<9SG%vVcWfvan^%J< zhAR#DDuc_mX|`BnZc5b4Q!G3XT?{7>1?KIthE%Jk*%RiE3SQ^2-V(FvA@bUS0b@$C zd(cjVYeSUtp>z=Mo%auqi&_)O<-1sx@ufNrN2~UjE0OEaqqw4}4raISkwo7n&RKxY z8{GRQkv$A0_IVg!uVUw-E+f=aeelS~Y3flfrvOHao24TL*U5n=WicRVK88n}*rx6M zBj|p9%VTSpD#kI9D41=N|H(qjiCF$@j!U4TlAz?55#b>cWbJ`r#kqXxRj)+RQDrU_9Tel_ z_8Wch&`gWqAxeCoFqU7{r1O||Hho`zECyD4VEmD^V8nJOOFRas%(f#E&qvy~>6gcd zJIJ$Mr7IAA?Q2T|kjbIfAPc324yB(kR66@D{xZDm=a`=_jjCLJp9^CA1#FMMzYcw8 z{x!+sb6wt3Z0aiuqn6^r5J#IFcTk7S%H6xCXBPg@56w$4}HBBm+afRaw0k*IV^ z1H2%VwqS7;BXb!R>-~5^#0@9zmakRbNF_Aof{Z(wFSsTgub7MPjMCuuv6nHDprUp~ zG|)LA|EE4Q*DVp(mXrf~*ojaRTEW3d2Hv8>6!+fzSH#C46X95m#S((--OHSZ=j~w< z(W1aG236^fW<4oPPp(NuQMXoT!#?0YkS8Sl)^E;Zc?>OJXqbVd%ZQ6hm4KqyefCd7O^VR9XbKc!ku((e1|bFk3fO(p=(6U=g>3gS}T!Tt1*@o zTc13}oD@Q9k<76Fj>gh?jeDU6aUS-o|8W>ymZ;dA2QE@39>H#jko>F6X@veMWS|-i zIv5=y0!SFGo`*=Lyq3+iK;*bg6EA?tAq!DDL=fIl5WwNn#({>GnUb4n1=E2a4YvxabQI( zHE}qh1An!tfWin3a6O;;@2W`!De}Phvb3-w*clZ7%p}8^#xiR)^-mXKT~p{R_5%;h zln?*dI}!Ndr{_GfNnN2uQw!^PU4(@pPE87PR}Pjh995VAFX-`-b!qTL%7^&~cLvqD z91o4FH2v93ClAx%&F=d}UC=ZoVR15r97wj8Qy9ie(n;3|o_u89z5~mby?5*e;c;9^ zSsd%t7h=a_OVit&#q$#DYdR7-(q5zJM2yz0O6jD8Zex>Peo9Vn{|l@Vedml|L)b^V zR!*?W$C*WIzWku2wv!3e^rl6Dh(LDtA1~1ly7@q?UHOqBOt!8MUY%{}@(Xxoaw))r zj~1B)q-K*^bUNakUP$t9_(e(9aH6(0|E*yuO=TE$Osa78WiGLa4RCHjP9P%*EuN-p z+nvrBKOk5rCB(dRet@@r{ap7t;2H_i=C7z_dVzjurCx&(^vnf|NHi6wP~SO9M-ke0G8IJfmdm?k zd)Ni$h-Y^y4J-^Ah4(sAMZ+Sx9t+e&dB&9jrH2Ar5x=x({<4wHo%GekycV`h?B`uk zQ)+u8ABtft`PV`K_s`PHnFJhcNf|~7N+8^~|KTh+dNtUO=O4@?Uk=cyxqhMeg`6!( zgm#$#TR;mtBd?Z%phAmbqtI@FsAen&mOeoI{*JS?uCj00nXM!%D{tB&ul?X66R={j3v8sGF zWw1mDh)`c~l}`JrzERF*La{4(ZEX`VUA7f633Xh$l^FowNxK9m74yWc`&Ju3`fyO< zLn^o2qY*Uz$O13Rcr>uR<&E&`2ypT!8htkFM>(Vt?2+|UFQQ{F&5GxuG7!OZV7+W3*%t00(?H^eaG#v!NHpNrvvbrari=nFJ(fH z0q|G1k^R8Kb8hp+g^lG4wCDXN@u$$Cx4^LDMSG5UwpwiJqt@KtzAr>o>Vb5Wv*afc zCAdEBUw_ISA-2W+eZSIlg?QA3bzY;&f+6l-6IA-r!IhU2s_3rzl%u;yK8fSc8N;`R2lsH?M#u}>+CI`haEbcGMAPbF8(|zlbJ#n0lgsU& zDeB#QtxL`c)|$_5h@6VUERy$~GOeReu}t=HylON;6oHca!rij{ zdA^IAn;Rz6x3s3ZSAn&yTKLhzDgxxUMjTzq{RdxFQQQ~ZfiBd`q^?*+evCHI^9i91Px|# z0DdjQ2lF8lVtFvDFN(10pUeK>t$TT}Y%c%(Y6qX3;`6o&jBcfwgsKW2qe68F;sTzU z4As9Kd}0aS+)6ubeX)G^Dmx9f-rO7&p2dEY)%>ra9@Rltv%kc@1xz) z_J&W;vB3LEFq225?kmva!$|*7A$BIgP#6ZnLEh58{Tu5c6^yT|s~O%ThZCc^wqPd- zxnM5scp{2XR1~M5_0AX1uLI9kF_59Phx*k3Nml`o%5biZQOoxbx&*o1-?+UW+p{!J z+HS|iR_?qC!Em2JCD;D}(0u9JTsVpZlaIRG#aks0i9 z{9p=nvLLwo^C5jSv+mA7axG_uW-Z?$o5M(n8W$qgs?rP*oK8S;j)iscDm3LWAH$Bs zE34k_ldh57m`sb_mg&zCybiP=RoSDxeo0pcnUo*ha{MP(8yaRV|W*fm(6=r zCzXB+Hbq#0l)RwpsR;pNk9lk${qoVih{)rrltpZJ?e0P6oBLgl4zyo77Y_i$D&mSG|5vWA?dBKTNxpQq(!<7e3 zTQgzDe3#_Yp_46wE|v@D@9b*ee8etX0OB4gCWX=I8pX#9?dC{-U1wDzBjq*hnpiaL z36a`&pn_UX-*$GQRi|&s=<4`_F%l$yPy9!$EA*iCs>u%5zr0PIP9ap?!I(@Ysyyp} z0c>MK@Fss6If)?C0~fVWF>Mhglfh_R9Q6bwnc+z5{WY(Vy+zIx!j>Zg?&e6NAF?3 zx>)$U&s`BE50ea!B$^iJzwa1C(LI>Y^gk^)yivZQ{{xts6sAlwf$<=P5)vt~19*Wi zZ7G2qpM5zF6T^~aaFLZYL7$uPWY1lO8xHQbYN0eg&Q~fh<*<^t&WeZ$p4VnV4OoV} zsY(9#sB?cRH8&F%;oNU!*f3=U)O$yw?8S;jrw4617O2>6c!09!2%V$hS{rK@#{w?t zyyKv@U{89?{gps!e65&KLzY3&)5L+g;H1j#`_5YKelB!Th)J{Sl?_IfN?=2MAvl*Y#w6!B5zx25d=^NR1C)I%@ z2^y-^6+Dgq*O&-fB#q~EO~Tw#?w$l-bwN<69DvIk>WSTNA5=jJ&~I-O0%p&>k5iLQ zI~FO$ukxc230WTlZZLOfSTS4FloZN6g!3dp(|i4)?|5=F5T`#1&R4io+0SP^lRNxQ z>qsa+I>)4#uQt2evC#eK+Y8SqJ}$BI1iHt_!!+KlFujPQpk$_lh8iZ}`kw5cZi=gt%V3SSl?AEU670#?`Gu5p3pGAK%(a3>~cK{Mh=J>0I2K3xu*xhus^ zdd^n1Tmvb@#Y)LILNLu_aB;ULQbjdiumM_XA&3$m6lE}!uAnyub-;yTMqCeF3FKs0 zC^3R};CNasaoU}DxKbMT3j${6AhZ2s`;VYlTGIjMD6 zSXjVf()5+gYUJehgg~ri-eNp{7$yFARrB;F_|&*DkbX#Z&qnhVY22~+!bBlJ03x{; z9MLvU8Ogf7^R=74x8ob#Ol;02J8Xnu=uJ^o3Jg`A{fbRhuI>E3sSkg2u(itfcNQ>N zALGhh#*5Z8F}pf)NhH&DXojcMr*UFBlq=e1ixm6KS~fP13mXTAZ;Jl@(D?D9XenxH zKvh*SfH?#@?!x?rPd0l6qd8jJ(P7_+gPbKr%ol$oIibGef@#t@`(prgPvTSky9fU}pUs zrr}HYpzFAIc*rl{?nofZzV%=rkBJP~CEHk5pTLOlpaKE)VbHmzmm%P*b@I&~$M)S% zbZ%h%CNaJk=0AilZk57??WfB*pV z%i*;MCJ;)LBV6~nx|$H{EE{-OT@%j1iynsUmfZC59;Bghts4vdmlgb9EUN!Z+56vR zlkB|)?}@_gt3+OjaO?}j4l-eqRff{yRD86IOL7^e^~3s-6DAXoRs6~e0fYD;{Gsoo z2jo~dW5{hIV7TctJz8{Zhx~gt0Z~1rz+GMat2B)EqTN$(Hw84I_@4ASP}>H+mHPK$ z_ej7YnP*vUOrkjuox}t`X!V_?J>MWqiE!W2mJr-pp0VmjgrqjFp{5T(#wH1hMoV3}m z5y+U9Le7md5KWrM%wANEk5wnsqw8!$_e0XZcOkkaZsPK2(K|H@| z(T8e}(t?IIW(#KSsHD^%2W$i8DZZPvtqli+3>GvSYcWq34_RwH;$;DJt1UZbHu@K8 z2?CdFc@im#)U(7Gv5&u|1iS{up_uRC0`UAL3%E6#5@Egk`<=otW*eXRj1vatrqR~~ z*-s>!yj00Kp7mUiT@VFk#5-0KSi7)h`(kshup-t!%R)6d7p(A6oYNQeNDLh0D}cZ7 zC8{}Fi_WTh7rY4N*v&ZRk?&XZQ4AN^FaepI>v-LrD79>dVqIBaZa#k^Wp+b8k{?4B ztk;7ufFCs=a>aj6*$U}vEj$_Ci6iSnPWI{2 z?l0qDhlf_jd_RRmmsva0PGER{vSP*jMnsYJ>}*+b=I5YUder3%nIXBS=HIYqt1SP|5Hk8>%y;#N`(4bqLT-8f7MV+|I? zR^zy+U_Ao_yJ7=^``{Qm>MqrP3bG^lUKtXplc1*sRG%g3PG$$ZEa$-5*JCbFrl@HUf7L${k)l3?RZnN`#^_J7b3iT?JZ?pCEJo8;p)#>;@w((Iv zff$`$05jtEc55p3ZtAGFO}phHFb(AyX<*!z-$y%)?dx;AfD zCdhU-QM}L1#jehS+3nb45wd=?-Z-~6^5T4%T5GWW%HOcS|Jlh?RFRNF2K8P_raj~g=0_@c^(0HbtH1~Zfv3U%vk%8U4DlHdaX+93QpSW9C@GUHAvtf|k$7jBSqCtPrOXX|Kc#O2Xj-svG41Fu;7$9%(3Ylk(MmsgKyFkbaSe zclolG?eaiG5$~qP43w8}1&t8FPD~|jPyZVPINpL5)e*LU4Z!=#5C;mM9p{IG@+oAv zCEoBC^-VjH#Bp(yb=wStxtpu8DOBHKe4A4L$rTfpiOmtR1fTuZaN{)2$#8O^n2!0}V(5{F5!gE_iW871xzc93QhN_id!Ee*eL@J{Q1>8ng;)34RM zT&{v1uiTH)7#J|fJCEZ1gQ9^uaKqa3mcUECCB-ngTM8Bd^HAamK%?%8qyvCEZVzR4 zmUhwG*-P!ld2~K;4H`7k$6{#fqP!*)m=`0h=crz;`m-gOn-4AoZ@e4*(LFT#DOMAd z5ibH$1Ti=my$5#mta0ccTewHfY?UVZR|=;eQ$h2BG+Gjrg%jiQkevzMmo9(}23GBK z$(fZfDfsP@-0W^#jbk(1fBIG-m7qsiu=B8DKcXBSU*ncRQ)xJ_QEo6`j7jK4KTXkKU*1;LDO2 zXSBvp9|8ROx+1H}$;50@){jP;q+s0kogs!P<<0zN%}@HT!QkF5xkF!06WL^QQfy~) zQr9gfz^Gz`n4C2J^v7EG}OD8=aSO_dXs^h_r5=~O^&F2n?`$iw|K3ZR@fn`K!_8vi=G4h-F zKY%`QA!Y)#p{RTc=Zj2?cpmVLG^pK&yFc76w1W{uIDr+fOo7F=B%V{fv+qS=#7?}( zMc&__?X4rzwhat#0OAMV9#(Ur$tnJY*OrC%wmW~E`Su{@0F78+`%rA4{-*k7Td^&9 zU;Y5C60O8jZIUbvaR7EC6^9?h8ff&;3C%ZwrplDpOex3jdv~?xu57tRTYj3cqEq$~ z+X$K5X>mgjqyrb-Y^rP+45t_?Mc37Ogd&M^rkKzfWr*B18Z}=U^|lXP3h!h7-GvT3 zpni@-SL#N*23MQCaj*;qUSfqD<{bU4A`<@B(ucp>X2pmMs7~T&hr@vLB-%SG+$OOz6ysax} z2p?!(I3B!X9w_g^*)mh>x3~D_)-U?|{{fhsUMFnk=4F8rN4a;uepGOvZI_Z1F3Ep% ztpMQOa>HCM@4?y&&V8wh_1|*jS9qr^9n@_HnU5zzX##&z_YG3Yo{|QA@DkWR3X>%P zP>)UJ2^&mVR-sL*^$VpQs6@%OGIg1#w&KK2CH^N~olybGquh6eCT`wO3%lDuYe~(} zqkf_uCjSHH$RH}vYM#NRH{aHt)|f>)qF#!aJlu>0a*EHKJygB32qv*1i3(X7IHQWy zTR6;9sNFsCrA}Ah*L(-550Z8zafj&eQ|?0xQ-5&hJE;%-5l=4V@J;i1Mpg2($OQ~4 zs~x?zCWSpxK$~NP=5Z*eXZ@$M(H|$ANv=s>!w?v^E zX6z~jlb2sm)GD3M>U(WicF60$_vn>vK`%8T=9N!geAqT1V`Umc+Aj@}o}bkgT%;<9 zMF89;Oc3v(=kiO%1HGQ${RPp)u$D@(+4A-4VU_j|%lKoz#}RB18K`-jGu+&tR~|~; zUr0`i<~=4dB2mWx?^kr)nPq;i-BZQ~$tLQr6yV)q|N6*HDI1*!5(kpNFw$xjK^l8) z)qn#=vlSEOE5Y@xZ+wm()%Q~ zr6!bFT*jR)y!MQO6+$%yxXTYQb3;rt=*ujYh6k0B z_Y|Cg)ms79Z&f_@`50CwUqRsSu@yIJ#f?_Er3_6xmq(SS8|q^B{=1htMdzFSL-w(? zRFmBbT?scHv94C(7D*GI`iH97ALn5-Qx|{PF30B2_ba~hKSfC&X7cXFP+&n=fLqrn zUp(rOci##<6?cSq>5FTIfOBB9^!+ z9lk#iyo^}^_5b|`;Jasn^=lW-XIgEMhpCinzLe;oLz|&OC&P^cM#nWe-)7Lvx3W_G zG2u_%uV8~9q?lU~=ZDRXW>la&d;*82aoa$#_0M;C+Q#cn34nFn37K^b#PdZiKy)bp z8JLUh$V;xGzvMvO;x9}p&2#=ul9Ve&3#Gwmo6mI_Zqz%t^|QXnF5*4oJ)9GV$c1}( z^p|L~A&cF^tHb`(V+#&pcYTv)v6yFu!C7>6R;Bozg^rFK5o661!j9DGx+t99@6oaua{aZx`)c&p_j2wCTkXep z6ZiGfiG>p7~g zV3sUh3|l)v(@R$0p!dLVoM6w(t0+ibtN@26KWQ5yf+}X~xiLjTf^yZX(rh(9*u;s@;bB zQyQhw++jG#JUREN1P8O@GDcAMiEe#yZ(*Ry>(SM)S_Dl`EhZ1?(DPjIm06IN#b?Xh znLz+Z^bg?Umw7XXSt#>xR`GPp_2vjhnM*A)D959$tQdD>2|m>>Oj#}TpbmjsYiiue zPEC`h`_?E)jyeMI*piCOPoucYmaHH;1T}ZWHUEpC9^JNDOu?fHC52)m)RdWB(-nQI z&qVc;%n6k7d##Q`T{Z&`B{b z>+Zf7%3{p+DaMzyPRsp0bWT`|^J(`h*}Esa&g}%og@QR14nO`0B6;-l;?cLMSqHV4 z!iU(D0k+PqF~v`aH^=$3OO3e7;k`1oYrU%QeuVCfDDZ_FoW^nXSW0Z`b%x0VXx>x5L(Kuo~P`ku8OfVil6Z0p* zm`dS6%m*_luR@RD_S|i2WNC|)n{yh?qLd&Y1?EAZs?o5|svjuJA|&4S;~#*3L&u$n z2UM7&#j#`U?2M#!@=-ty6sov@@*;0}`k`nrD4NdZ*Q}F__*y{=ElykcV>xB!k3)%t49_T1jbe;7l^SaN*gq`PFp%A3 zmHlCKLNf0ME}(ID1x{iX(0LBZ2sPBeo}=Qet#D;=JCu%f14xsyI0n(x!1`Ag@Voxqa%I)NVbycdefS+<>+x!NtSEvF{XAY`}KlI5=;uSk*9cUcK%KW$uX zuTFlT98jxGS(AL&`%G(t2s|-2%iT!L< z%dshBsVtO&c_tGzeQfy3_{tn!`v5*_@#mhCoD=OFKa&R=b$zoy836g7oHPCl?!#c* zZyMo$eShK}tq zM(OU{&QplOLkVKpiJ8l|FY?<(P1dm*g9g61IRP_5e&Eko=Qd=9N~A|FB}_zO<*70m zu5NY5t@znVCYLH)p4(y%%X{xurJuHOM?yFnPHu~)J8HT!e2Qacuy$QvMg&C;De_jh zM_qL6KEbW!ELd&_RCjvE2vjNI|3TOw6g;76KT(_ha1nZB2rt|e^c8%znidA7qmGhk z@kF`|w3J4<#;Gf!FFD>=Az!4;1?#gC7)|%6jjH=N8Q3bcCFjH!gezkk#sz^W4P&I5 zuKoqf6-25IWT`CS-6P_sz46@?hW-e)wgvrFlo{Ci#3)-io_rsDxAF zjfo1EGKF`t9*LM(hE719;r0&zioiv$iG;z-0Y-t@VR*)yQ)G2sKF3VI?ex5xf@Pp9 zQ7&VtVC@DB+Y!1Vf`>`IyZo9k1l0PRkw_!QQ%V)}J6>$|Q=6Qb}R1ApgOS7qIj#gU` zWNqQAo-Gl>#ZG3RciSDn`%#FeGr}3?YR)za&eYF}UT#FLq$T;QDp=QlVXpBS;2%SWvbFQD2p&DJ%EOQ+`iX)zY}Gk*Qg3r)Rjm z+ZKkNx@%^S^uf&>V)Wh7Max*?PTqzHC2*dNQhRV%1bKAUL@x46HU8>+taGIYcIOXM zmMT67dRuHy$#N!UP#R|yP4MvC%Gy&K@yK`Rl}2|wB{%rIBE634^JSr+C3wYoUfdT= zRI?u?ohzuy%Gr7C39U%lV$p`V`OMkzLp2y@*TjH@f|}UTpIFF;cjZnLt=X)&u4aD~ z?!|JM=@u6(Y~dHl;!Kl6pEa7UgylMGI|FUDd%1NlipS`2d2abI_DcH<-=M1csMcd~ z!{j9K1Wya9T&J_&bK+bMv5K@_V%gZ!+hMriX<#5Y+rsZFHj`$$i;ILgOA7ZXGR<9i zfj-~%GM6j{Dj=w(@OKIvtepN}qC~r*tMkd+0NEACt>1k$=&V7C2==n$@XE}$u!JDd zU5=*AX3vvX`bCHw_--oK%bKo8Wohj~WF8&^JKgE+x6o@>v{4npHBLTxoYPjQAe?zp zr$mCWaHWriw6|g(y-Mn9H9?`zZC&??`wJVC`T@Sy7StsPODIKPoSFQJgMq{6-{ zq+8aGe`MR3V|Ogd`Q&&`N`-|XS9n}|=m*6X4rhDLw#Awgl-%(CjzH^9{5Taqki3Q% zv-?R_5>Y_Zw`8#|YbA@6_o-R(KRUTWiJx1F6ZzehY zWI-(F#te|cavzLU?S`eh=~KKfQOEo^j!Yb?oD{&dyk3^e{uq+$SDGN0HQvk#Tz$P+ zR%T^5`5$_c<7P5JIzEbnpI#*wTNRtVsqM8>ko6Um53}gtkD@2HYicJhFQnC6j{?7h zr}P~Beldbh0}z5sqh6_Zaajv{Q*C2VuUQ-#CuC8pPuwix_HZzX>(N$&(1w8%^HCi8 ztv!w2zHGb#YT9lkDUB0b(gehh@E$ZFg2AW(GOKL7KLYR%7!uU%8aKD*igUN&F(jVa zVFBjho=dcM=Y-jnJij zRje)fyX(OZ8aYbvi*TUe8mlofq`TWQ93znV_&XRUOf>K!e)XLk;-^HTzY>t4u()c_ zk!2X)B-{N1^>^g>Z2mC*xmI{@zVuwVmVy!YJ=N|o`HlXUDUsJFrQ};IE}e_G-LPIZ!A5vf})$-##8qp$&0mx`)CJ_wgi%(D7ss> z@wn72oo%tI!naX|d;+|5O8zf1@3Zad$`2pjlxQUF_{J2Tg#6W)I_sIm|5B%1A;LY&u4zj~+>L95zV**b2>6E71mb+d`~9kEWQ(`kJ7of14*ECRfsZ2`1pRTm zl^npH4s7Iu_ACOXo-`y>#Q1fbm?|$W5Z9*-hF$$Xgr;+aKMrv>YfR1Y7#x3iom$vt zJ0?VxZ9=)TK{B~NIkyHPVjUCckYYQd%_9I7DJt&9lrJi$51Z|S@pgIzw`EJ4f36S) z%}Hw};tnY9Cbw~a!zu;BPbBblOq630VaZDFg@55%;jceOd!l)e0`0VggXV&9=37+i zjk?pvkRsPJ)l}*zXPk?5RxW&<4w>bVX=u*0;i23oM4%cgR^ilGRiFfHjX&b<6=KGDoeQ`Ht z_h;n&^tF;N&K&RVgHsXfj}yRgpZ8m(h*;Oj;Euj!$hJzU!iPHp_cTTzZ2(5$H(%s= zfcs`&TvhWR`V5!BwrtZV^G^>KVm)2cFid#tL4+KOpLHD4hr#P7qb_!NfNoGrN@DA& zx5H;2aqzYK%ZS6Bc+aimxH9*$PF~PT5N!vzJ93G#07IR5 zd{*Wi$}9BRE!+9R3dtD$L)8H$98APPN3WBXWh?V7z9~uyIAzD3u{IjO*Z!J-aXE#2 z7aaZ%p!uzQ_|iC-$R|V1F?eK6IB~NCy$zRYq!hJTc;bm_YMo9QKeUtI|Ey!B`0lLHw~AYGmNN{-bN^NQn^wm@ zJMFO5=PVfFaBwmbqtf=}dTQ;q5 zvo5!2L(<$PBI{dwyjdI}U1o#?V3IaZkiOZy#}PVL-zNd}!>9((_JH|v5l1MIB^e$b zVgQ*^UwYam)6qiQEFwA$P19(h3CPF6X8v2;g+5iIA7PJCt8I-{1$~a>beCV4;wSzA z_^fTW&YwaF1t(F)z&mv2`LFyA6z;b0E?K(PA6{FHMw|o~L{(}{+Jfejp$o8fsMN|6 zv~!Dhv*j(YcN>#dM=r<7DfXw;>sP3n=eliOnb0}c_qf)Y62ZYuE}iXnUMJynOLJQG z@78hF)b-|zG3?#wEq}%bP1+9f8zEBSw0vhAzh-FC2Evc#RelMIU#)TOA@|!RVn7fu zk$kv^6s+yJCN6vhkUdDeSPgxbs2Sj4y2Lp1TA#6lOV6^iWhlyR(f1{(XG!KsCU8E# z)D?yfb6AnZELX=H$gaM2?=~{bQUZcL%z~OocicyGnEdyZv;sPfx%36T?Q|4%1LhV# zq0?Z;MF3p%dgKoBV!?=7kn19!R7FrwVWsZr{-opP2Xp-SWZ|#gGgXraMpNW(cuuD> zL1FF+t7W{7>{k8t7af%1Hf!Q7%Dpt(_S%~a5jC{zMR=ILK`}n+MDmW)7$e~G-0ID} zyfdn3D>uuUN=>Z#RRYTO;3irhYxuadT%@DlA2>(yEl!MN zJ~!ACr@x#=ke!yaIb?jok=W{ACNLNLYLdqaec|s_S}{h z+b@AR*Bn#xoV=e5UUgokw+A+JL}d4FL8Yg6l}O?_!{wd z)|?jNUiP~rmzSJo*H3DlZAFFpXP!((Ob}Wrqj!mUMXmR7zP#fsvYAFHv@3YA4NsD^ zlsq~1N-6ZaJ`pDjAZt;#1lt9pT)Z>kR(t*LC!`?zYZz#5^FqydI7_K+kJK5gwm zc#pl~zBW+$_jf{2T`aJeszXRAqBrX&dYCl4BE@B=z_yOSfd~U;9KR6^wWV@^0&{EMOsqj`4@HLvxkdfsCQBvXyE&KlBat_TqyZC zJ+SO(0Il+f3bh;2hOYX~c_M1|wx{)$Gk%@4@%}>nxOOF>juV=VvI?J|IQUMu*n z=hv}+yp4N$9{D1hhd4wISGgtetIZ$!rWkkwvlNRiUkUil4MC#8$=QI(s`s&7^!irB z?uOoFk7;jHnHJ>~YK-%EX5n|%Srd~5sZ=SE{sBr<5f;$6QmP6lq9gPQHn3>l`OiEz z)d2gee{L0Qm;wry{cm_3S(QIRJfBU=Hv5=d6(-xgP-V=Sh5gqHY|?et;QwxBqVz^0 zmTJE6H6Js+d^UhN{44z9?jmLv&n$wzPCYG=8Il1SR)SOlS3%c5*hwhaC0*@Z0mH*w zVTBFK#4aOTc?BTJK?<^9>-^XTnFoLISih`j7tK!{8Ur+x;JXnFKe$Av4}nk>>UQ(T zN{XV%#UTgxf%jY5{f+}&fBZYG-SbX@bZaN(U92Bm`t6FO6G1`Ds+W)znTQw_LfOsPx<06x$Ecsh8BwBCFPD#58$Vnfj_V7=jVckkHD%>2K+!-wk_o#Z(3Kf&C6o}6QT%21p z#E5@dESkG~A5n`MF2~dH0G9rqUcBGW=`44Vnh=;Q{j{3PY@gLtN5Q4cTYU7 z!ih+IXtpT|RzbzoDXIDe8s41~h7i3vC#AKAwnAiP!s!^(#yCGFjkR9mmW7g5&eUK} zMp?GjEP2{zpd<~rE{ex0pL<;}E2`3_!7hTt_9W390hS5HDY=pB z$B9k%_EZ0u(~9D(&7os|!)YbH4{k??PQ_>=2jV9&mCnEm7QN9CbjEKvk;$2SvVv$z z&UXci>h_<9v$7J)qz+K@B=5uzvLn}I8=6TSi*J^5F5wUIC37%`+A7K~>Ff;!vvS|^ z9dptc+SSF=tfzsw^tO4v)MkrRaj%z;l5;|9lA~nm-KfnJMz~6O0{iKJNy2UT95jz> z1%#;50j-oBZ+e$;+S|2M{X320z~QXTHRf1h(=c&XM>wLB(vK}|Niei_d$53SNigRC zQAB*G-cstt(p03k#qt!3f;d1LLOgKFeW^kKMgs!of{k0vV+4x+vQG^m!TJX2U(UJw zKeWANR9kJlw;76ip}4m|aV@R|iWeyEgyIx;3-0b(+$mPv32sG-ra-X(<-rpukV2r7 z=UsDV%{%Wob7p3(`M?T<4+Pjd``-8e_q(pQ6B?4!iHDCH$N@3BU=&Q$JbGr@jlf>u z-}NMQ&7V(HU$rw=pw;Dx(KGOII?IMnWTdJ9>&&%kB&r!}W?r#Wp|bdh8EWRG_Y(U{WyWQ@JzJONk4f^rDoug@!{*$ZN8iq-l!Xz-=Sb@P zQ^P)3P9s)%i}kD?t4*r-uzw+U0ud2D`@C4wuHn(;BpBBi`2sE)^TdG^3-@lkdyQZ3 zpsGTjg^l;zokEYOm3?UUIofnHcz7lWUc5^FlH5`5pJ|rz1TOyn+rWGBbxX_ia2>l4 zn$obHDLW?Qevc;h^4ik=roOz+sNvX==I38PBmT8laY%>v2hr|!lmk>o>#@EJ!rPB= zdv7we_U&P_wAAHlG4i1BD0u+85ww8nR&=>LhHeylMuXc6xj)Ic($!i8_YB=Nf4_`l zV00t(*Zr{go%b})CXrW^ov6xF+5OEDn2m8P^!Xs^DWwd#C@w*7fJ0J{feM^$o|+br zHgrKP{RaRe|KwWvYI(h21k`nHAW=f^kejp7V3OR5?%}NCTzi=0l7>ruqZ#|_#DaeL z(#{}7{hP{>x3pX~x{K_4$Or@lOVssZR(FS?>^h*9C*d^{WFR8e(VouW()m?11rw-n z7cCm&=({1WqkQ#ivI;`zGB|xP*FcZnB3Li|_eELtpIg!erVZ;MCFYCkq!8hGQ`4T5Xd~#*0}h_-;*YZ_#-u)IQ22E#&JvQXIw;@|Go5t7Jov!* zta1{=*fKD}-1K*|)&>uEKw-*xE{MDgkrCuZRJF%R7y=BtW}XtHT57D)~akNibS ztQqA2YjckLgKw9Ws``192eg=-FjXyo<2}qKmh^q4 z9Nt%Glk%g{^fC#xE6TU;U}hYgp8Z1(|@iv(;_`8^}|P= zCagWZL@>&0Y;5<~+Dx{o^*{1EU7>yi!{<7!XNU(2$OX4?>IPE>=b2%lbHLH&@tTzH zU9$!3_^|-s+X?GRL@J@^z_QuNJ6m&=i^cmb!Zm`XWsT=`f7c%F|Jz<|vazY8ikO(# zP2GP96h=!3gnR~>@`8zcj!Cvf)Ln)%X=B!~lMZZtH>+6OjDR#E&t=fpJ`Ou?7L(b) zdlIsqT zI$I|@6@I0Js|k7~Eb9IYt%t3XG9sIukCnlqsN6-|fA)Gf#4D%JSzugaH*On@yYq>@ z&P_;d=PUMUk!j(j(48sfbllr5`J^gXefar`AzCF;4JOmIr;2o`I(fCO#V_j)& zc=VZU9LLOg5ZXmgRpp$g{X{Vt0}Bdfto&fL@ZeDQ(fWw5WaM&U_DC|s*=KW}|BbxH zS=gz=zd7$FzR_(77&xIL*y-JOzUbA<*cysEc-(?OKq;mmG>9MP_+!BB|+q;PRdz7Jkw|byv#Bf^FCiP z$OYQyH}oXd(v|X{EI;9-|56{CJCh?$bf+^O_rnnV(6!&7c;pk^<^2w_k0Iyo7M#w{|V9j zzdX0`NB1@oal{v{Ba4CH&qo^8Mgb;@?bj>P_B6NsG+zD%801OOk9n32xIuTu)MaBB zaKUiyv*dvG(U15^@veo8JSv!~+Q|zMMBm-L68cTV@;)Quk_mvY@wm(rC3M$)k zPbWB?E9yM?3XJ%DvZ&~p))nvI?Z0^|i(jF2{>kmWMu?@OcLP%J%_T(J{ zqvzUVMU|@g1Fk+cosDIQ5yB8|KUzW|)`>60M>c=cm3U68wQxfy(A%*J)eO!?>W0ljF_UGCj2>llGzZ-nU)2M3)?S zoV~qREMW@a5n~a=QVBP6>iWyxLDU@@CMR56k{-RrM;>$z61Mqq=$WaFL_Csc^@=u* zCY||BKgPfO14-L4*2<*2y=YZ>P}S{NNpl~Hj9js*99;2!6nyDXyQS!eFEPPjZ?w`^ z$axq?Z9PP!Z$*EFm>-tS3nOwJq>V%@BjJpIPYy zuLZ*ks7F)?83r>*nbxpPZ1M8wGq^~O1nNOt=sbjyZ$C%5)S!oNS+jE-zHG%cwRE19XH4bvq}CVApQ8+9|ywgC4h z34ieJ_Wj2G0%A-W3mIvo#O(@1$~eav>MAAkpkm+LlpOI%AZ{1aXbG_sT&Mn(sujk} zFVn+pnai-#6xk@co_%63uYC5uE?I=oa;t`Unm)U@2oSPpzY?&B3PYRhaJ*|c7bJ1{ zNZ6gG#{8l0(PO(kXqB8VJ`r_I&JYS4iky-%oCPvGq4SMxiSQ_lK4}d0S(k8B&cv4= zJxAJD{(w!ymn8oQ}Dh$W0pxMsRbU8V6A@;AYBai8fW z->#zn0OYI$W^ojd_`auOt1!S&r>N)m_QLXx5KC`%u#k)%Oc|9=+r1=P|5o?&1hQx{ zF`L+~M5Bbw`1*h;HE^>N@e$^^Y>_%5A=P#oxR~~=75w=t!xw|+UyO(?icU}Hxo%w$ zK{X~tGL9XRrzCeSH3L~nU^$Yc@M4eRj^hwgM8Iwd`cR9%u2R=B4Ck86EiXp=WwqxL z|AN&R(Q4&Sns)6Zz2?g|3%}jgkM_7J>V%JC8mqc}Fp*o6j=wi>v@gefa(1u=$u^$7 zg2kk*i$5M#>V*FDY4v!$yhWASv<+)?)PioQ+(>AEbAFy>PX~uNS@}C>7?+E_p34US zeY8wMJ&+Il7tn)&}}xvB@DG;xXp{=y7_qV{HhQ2pl_=x zXsCC-`ugsA(|to#>dS?@IH%y7bK|n=E(MhK{eQX<$B-iv__%UYvs_#HpBy>=<2fw9 zId@d8`{JMlrrG94+9zai_Tw$S^&r~qobQa&Y>1$;&<>%`kMoHmeu7lX6Rl%IEpNZW z7M=0M#8dVshtqzh2P9vW49=Dl$?)k+!avbogCv{(qA9Z5E*^8ZefJ%j;&gJ(4p3~( zK=5oZnYNDIzblsi?t`j4p;VX_tK=-+i=?DEhh80pt`eVPDS3y9TK(o>k`*p}|4()n z!mPsn{S*9`zw4@f0ZTfwJ>Hegs|++}fe0ARq)He?7_|4l_(`Ki1mVGbCZQ zDIdt17NmP71J5N8nhIiAJf)7?v`e`z)t}wy`-27L30%dVUQ4xHs0w$s)O7v@ zz-0MWDoWkd{($#OChEZe;hHEA<0l_J@>Bdo|14^m`3B#H7=BzoyQyReI?|tj#-B)Q zL^}4!0=hXO{kw+$8IQA-rP{!3!no)@BWJX|tCD;g4vXOwkgy$`nCgl$di@3x)x?3! z8_ZOhw@>hum9ln32nnp z?ho~VzZl!bfX_Xyl}WdgYC?naD^~Wo%&U`yni2{| zVuUg1tBW^c^W0EPFFtB1N2B!MOYL@)WorhP#7t)Gs^~@YHTwpl1|B&A#`g}m=%9x7 zt;#pA|L#82@6H>P&j7z+3FVlLb{7cGd8w6zVr_w8lW{)uZY#Oga2%&c)q3Q$fl zk@lLFz4yM#?&6hjAz!UeVroZK3xNgK*F-h5j3f=-&2%97@1gdovEQ3Y_Re2f%hb9E zw5w2hN2k#8k=ptRh-cq+adHCJ`xM&0BChvK&cvh|nN?#>wNj7xQh#@^@oKSoj+_@9 z{^ncHGxDd^K}5r~bb4Ac@EtE{X4cCE_t0zwH76ALH~`V;QembZOo1h5=6i?+By9sC zdvz^X6Jbg?if7f4B-rXPZ((mBKA}fc-qeuWdZ_vMuoZxOdbn$q_<1oX1F{^1MQr%v z4?DO@88)A%5LSj(R5rE%i=`%=qeA3DEsF^$xq@N+Er~GECdIQtv{P8N_#zI+0URn zGe?8OE|UZag5J2p$$IW2kKGfmOSq1}Tkl^L?#QMAkQ0Z6u%*F`n#tbl?dhhtaPxyEVm_1tVK^-F0@m8bNHa|c zRhlJLpv8Hbql=$W--A1iRnq_XtHs=a! zw`2FtEBV>aB>>C(q)DpF;v2}*A|nao-p=UfzC@1xMnipBt5&YN^h(D5EXxQ2j|h-mVCLRuU!nrrN|DWxsBNpaRWm8kQ{2IGAwf^;5Xco$VM(Y>Ajrsj zJcmkd&nCywKxy(W?-g-*LM_-)f39!yXr1pntxViw4v53C62z2fwydXE?;qa8niBwE zp{mTFGOSi(H{YeZnhk=~f&>tbs6JHm+MDAwO5)%zCvLZ&Pd76N$G@dC1fA(jq8C!I zWT>)D^z%JP`=9Vosw{$(;l$c)%iK&HkDn`;+JD&mS=Sipx_s*y;`oZKN#xf+?hqL3 zi2*6m{oohVKGYk@mdko@CAB;l0{@9>YOY3LVlQQ@Di;_8h8p0U*PWu47FJ9R^r03@ zpf?rUP8)|a#*Vin`F7d&oT+ccxiz2FVze*;RG)RV0i{D${DI+5%v0Drc3457RijIV z2EF0eC8ICg9^QdIt@fKjyD`@iD@J=4v7i zac^Gt*0WKP^9XI;gEfRZ$JsoJMIOtZXhDMCy*J(PxoLj8w#qrVRcjHa<85Nl+W2r= zV~DLsIfsQZ=K8qB%hG{ZzaR{uB?%~vOPiF^xfjJ}j40F3?`(Kp$VJjzCdeJOY`qre z={A5&recJ;A}wGL)UER|$+3xljEJ1$r`pn=(}{_hUkOj*61y`eMt>IEtKSyG-W78p zwEb8kLMt6m&|w;0fPj2M8=rK}Yx|*tY(Svic&((#T^FhlG4%WTg>vqv5{8i1ARRd7 zQS>0DV{K>7uG`9yc0aH3rEE}KxxoQvYu{IlFk62p{`PSH3N05G!IdR1z1ksM~K}x|+Wo7ktqdw|8Jgy~z@S)%#j5 z%RWE+yX*D48LxRP$B|KIjlxME11fgD|Jf0*qF!|#=kR1HV%v^Q3dIW}izTio13n4_3!*)jIXts^cmqMRw0Ms|HyW1!vXOyVY;%d+j z(S5(078g>+%dng>;67HigNZ)%CVoSmtE7%=aAnt>lk=ktRp$5=g2Mv6jk(DgBrGu* z7>+t*g!dV-HXJwRE67v&DorazJ+@R@{?wDE@iN;niP@SjS!X#PxNMlXp@?+Y;5`>a z;5Q@KY+BPm4YA;o&JXoG#$N&fVY@ba`zWERGFl>mF6ilL!A*Y!kwoGWUYsQ~myCbbiMfO>|NLiXysL_qxyk z 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