From c5e530f180246bae49dae47aa18b6e55113da341 Mon Sep 17 00:00:00 2001 From: Mackenzie Date: Thu, 29 Apr 2021 15:09:26 -0700 Subject: [PATCH 1/2] grouped anagrams passes --- lib/exercises.rb | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/exercises.rb b/lib/exercises.rb index e1b3850..dc41bbf 100644 --- a/lib/exercises.rb +++ b/lib/exercises.rb @@ -1,11 +1,20 @@ # 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(nm(log m)) + O(n) (sort_by for each string + length of strings array) +# Space Complexity: O(n) (hash size increases with input array length, no other data structures made) def grouped_anagrams(strings) - raise NotImplementedError, "Method hasn't been implemented yet!" + anagrams = {} + strings.each do |string| + abc_string = string.chars.sort_by(&:downcase).join + if !anagrams[abc_string] + anagrams[abc_string] = [] + end + anagrams[abc_string] << string + end + puts anagrams + return anagrams.values end # This method will return the k most common elements From 2b90fbb667f9b14424da49aa04e0d1a456e86fb0 Mon Sep 17 00:00:00 2001 From: Mackenzie Date: Thu, 29 Apr 2021 15:40:14 -0700 Subject: [PATCH 2/2] top k frequent elements passes --- lib/exercises.rb | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/exercises.rb b/lib/exercises.rb index dc41bbf..0607f38 100644 --- a/lib/exercises.rb +++ b/lib/exercises.rb @@ -19,10 +19,25 @@ def grouped_anagrams(strings) # 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) + O(n logn) ( sort is nlogn, list.each is n, map is n) +# Space Complexity: O(n) (multiple same sized arrays) def top_k_frequent_elements(list, k) - raise NotImplementedError, "Method hasn't been implemented yet!" + # raise NotImplementedError, "Method hasn't been implemented yet!" + return list if list.empty? + + counted = {} + list.each do |num| + if counted[num] + counted[num] += 1 + else + counted[num] = 1 + end + end + + sorted = counted.sort {|a,b| b[1]<=>a[1]} + keys = sorted.map { |n| n[0] } + + return keys.slice(0, k) end