From bbe4dfc8cabdc35b985864d03084907343924695 Mon Sep 17 00:00:00 2001 From: Kbhlee2121 Date: Sun, 17 Jul 2022 16:17:18 -0700 Subject: [PATCH 1/2] Pass anagram and top k frequent tests --- hash_practice/exercises.py | 100 ++++++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 2 deletions(-) diff --git a/hash_practice/exercises.py b/hash_practice/exercises.py index 48bf95e..49d04ce 100644 --- a/hash_practice/exercises.py +++ b/hash_practice/exercises.py @@ -1,19 +1,115 @@ +def create_freq_map(word): + freq_map = {} + for char in word: + if char in freq_map: + freq_map[char] += 1 + else: + freq_map[char] = 1 + # convert to frozenset because it's hashable whereas dicts and sets are not + return freq_map + def grouped_anagrams(strings): """ This method will return an array of arrays. Each subarray will have strings which are anagrams of each other Time Complexity: ? Space Complexity: ? + + Ideas + Have freq maps as keys and words as values in a list + dict = { + {"a":1, "t":1, "e":1}: ["ate", "eat", "tea"] + } + -> would need 3 hash tables: 1 for hash of hash tables of frequences, 2 dict has keys? + -> or create this dict example without creating another hash + + PSEUDO + - Create empty dict + - Loop through each word in words and create freq map (maybe use a helper) + - if freq map not in dict, append to dict with freq map as key and word as value + - if freq map in dict, append word to value + - return dict values as list """ - pass + word_dict = {} + for word in strings: + current_freq_map = frozenset(create_freq_map(word)) + if current_freq_map in word_dict: + word_dict[current_freq_map] += [word] + else: + word_dict[current_freq_map] = [word] + + return list(word_dict.values()) def top_k_frequent_elements(nums, k): """ This method will return the k most common elements In the case of a tie it will select the first occuring element. Time Complexity: ? Space Complexity: ? + + Ideas + Create freq map where keys are nums and value is the frequency + How to return the number with 1st, 2nd highest freq if k =2 + what if k=3 + + PSEUDO + -Create freq map + freq_map = { + 1:1, + 2:3, + 3:2 + } + - have a max_count for max value -> + - could also maybe use slicing + -create empty list + - for i in range(k), append key that has max count + - decrement max_count + + with duplicate max values: + - create max_list instead of a variable + """ - pass + # max_count = 0 + # freq_map = {} + # for num in nums: + # if num in freq_map: + # freq_map[num] += 1 + # else: + # freq_map[num] = 1 + + # if max_count < freq_map[num]: + # max_count = freq_map[num] + + # answer = [] + # for key, value in freq_map.items(): + # if k > 0: + # if value == max_count: + # answer.append(key) + # k -= 1 + # max_count -= 1 + + freq_map = {} + for num in nums: + if num in freq_map: + freq_map[num] += 1 + else: + freq_map[num] = 1 + + freq_values = list(freq_map.values()) + # sorts values of freq map in descending order + freq_values.sort(reverse=True) + # k number of max frequencies + max_values = freq_values[:k] + + answer = set() + for key, value in freq_map.items(): + for max in max_values: + if value == max: + answer.add(key) + + + return list(answer) + + def valid_sudoku(table): From b747259ede64ef9222204ecbdacc7edfd0d617f7 Mon Sep 17 00:00:00 2001 From: Kbhlee2121 Date: Sun, 17 Jul 2022 16:55:22 -0700 Subject: [PATCH 2/2] Add time and space complexity --- hash_practice/exercises.py | 40 +++++++++++--------------------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/hash_practice/exercises.py b/hash_practice/exercises.py index 49d04ce..4f0edbc 100644 --- a/hash_practice/exercises.py +++ b/hash_practice/exercises.py @@ -12,8 +12,8 @@ def create_freq_map(word): def grouped_anagrams(strings): """ This method will return an array of arrays. Each subarray will have strings which are anagrams of each other - Time Complexity: ? - Space Complexity: ? + Time Complexity: O(n^2) + Space Complexity: O(n) Ideas Have freq maps as keys and words as values in a list @@ -43,8 +43,8 @@ def grouped_anagrams(strings): def top_k_frequent_elements(nums, k): """ This method will return the k most common elements In the case of a tie it will select the first occuring element. - Time Complexity: ? - Space Complexity: ? + Time Complexity: O(n log n) + Space Complexity: O(n) Ideas Create freq map where keys are nums and value is the frequency @@ -66,26 +66,11 @@ def top_k_frequent_elements(nums, k): with duplicate max values: - create max_list instead of a variable - + - sort list + - slice list + - iterate through freq map and add values that match the sliced list elements to a set + to avoid duplicates """ - # max_count = 0 - # freq_map = {} - # for num in nums: - # if num in freq_map: - # freq_map[num] += 1 - # else: - # freq_map[num] = 1 - - # if max_count < freq_map[num]: - # max_count = freq_map[num] - - # answer = [] - # for key, value in freq_map.items(): - # if k > 0: - # if value == max_count: - # answer.append(key) - # k -= 1 - # max_count -= 1 freq_map = {} for num in nums: @@ -97,7 +82,9 @@ def top_k_frequent_elements(nums, k): freq_values = list(freq_map.values()) # sorts values of freq map in descending order freq_values.sort(reverse=True) - # k number of max frequencies + # k number of max frequencies. Assumes if k = 2, and there are more than one with the 2nd highest frequency + # ex output = [1,1,2,2,3,3,3] + # 1 and 2 are tied so they are both added to max_values and the output will have 3 elements in a list. output = [1,2,3] max_values = freq_values[:k] answer = set() @@ -105,13 +92,8 @@ def top_k_frequent_elements(nums, k): for max in max_values: if value == max: answer.add(key) - - return list(answer) - - - def valid_sudoku(table): """ This method will return the true if the table is still a valid sudoku table.