diff --git a/DIRECTORY.md b/DIRECTORY.md index 3199687..03170f0 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -58,6 +58,7 @@ * [Arrays Intersection](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/hash_table/arrays_intersection.rb) * [Common Characters](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/hash_table/common_characters.rb) * [Find All Duplicates In An Array](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/hash_table/find_all_duplicates_in_an_array.rb) + * [Fizz Buzz](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/hash_table/fizz_buzz.rb) * [Good Pairs](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/hash_table/good_pairs.rb) * [Isomorphic Strings](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/hash_table/isomorphic_strings.rb) * [Richest Customer Wealth](https://github.com/TheAlgorithms/Ruby/blob/master/data_structures/hash_table/richest_customer_wealth.rb) @@ -85,6 +86,7 @@ * [Coin Change](https://github.com/TheAlgorithms/Ruby/blob/master/dynamic_programming/coin_change.rb) * [Count Sorted Vowel Strings](https://github.com/TheAlgorithms/Ruby/blob/master/dynamic_programming/count_sorted_vowel_strings.rb) * [Fibonacci](https://github.com/TheAlgorithms/Ruby/blob/master/dynamic_programming/fibonacci.rb) + * [House Robber](https://github.com/TheAlgorithms/Ruby/blob/master/dynamic_programming/house_robber.rb) * [Ones And Zeros](https://github.com/TheAlgorithms/Ruby/blob/master/dynamic_programming/ones_and_zeros.rb) * [Pascal Triangle Ii](https://github.com/TheAlgorithms/Ruby/blob/master/dynamic_programming/pascal_triangle_ii.rb) diff --git a/data_structures/hash_table/fizz_buzz.rb b/data_structures/hash_table/fizz_buzz.rb new file mode 100644 index 0000000..92e725e --- /dev/null +++ b/data_structures/hash_table/fizz_buzz.rb @@ -0,0 +1,32 @@ +# Write a program that outputs the string representation of numbers +# from 1 to n. But for multiples of three it should output “Fizz” +# instead of the number and for the multiples of five output “Buzz”. +# For numbers which are multiples of both three and five output +# “FizzBuzz”. + +# +# Approach 1: Hash it! +# + +# Complexity Analysis + +# Time Complexity: O(N) +# Space Complexity: O(1) + +# @param {Integer} n +# @return {String[]} +def fizz_buzz(n, fizz_buzz = { 3 => 'Fizz', 5 => 'Buzz' }) + n.times.map do |i| + i += 1 + num_str = '' + + fizz_buzz.each do |key, value| + num_str += value if i % key == 0 + end + + num_str.empty? ? i.to_s : num_str + end +end + +n = 15 +puts(fizz_buzz(n)) diff --git a/dynamic_programming/house_robber.rb b/dynamic_programming/house_robber.rb new file mode 100644 index 0000000..e03a0e7 --- /dev/null +++ b/dynamic_programming/house_robber.rb @@ -0,0 +1,87 @@ +# You are a professional robber planning to rob houses along a street. +# Each house has a certain amount of money stashed, the only constraint stopping you +# from robbing each of them is that adjacent houses have security systems connected +# and it will automatically contact the police if two adjacent houses +# were broken into on the same night. +# +# Given an integer array nums representing the amount of money of each house, +# return the maximum amount of money you can rob tonight without alerting the police. +# +# Example 1: +# +# Input: nums = [1,2,3,1] +# Output: 4 +# Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3). +# Total amount you can rob = 1 + 3 = 4. +# +# Example 2: +# +# Input: nums = [2,7,9,3,1] +# Output: 12 +# Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1). +# Total amount you can rob = 2 + 9 + 1 = 12. + +# +# Approach 1: Dynamic Programming +# + +# Complexity Analysis +# +# Time Complexity: O(N) since we process at most N recursive calls, thanks to +# caching, and during each of these calls, we make an O(1) computation which is +# simply making two other recursive calls, finding their maximum, and populating +# the cache based on that. +# +# Space Complexity: O(N) which is occupied by the cache and also by the recursion stack + +def rob(nums, i = nums.length - 1) + return 0 if i < 0 + + [rob(nums, i - 2) + nums[i], rob(nums, i - 1)].max +end + +nums = [1, 2, 3, 1] +puts rob(nums) +# Output: 4 + +nums = [2, 7, 9, 3, 1] +puts rob(nums) +# Output: 12 + +# +# Approach 2: Optimized Dynamic Programming +# + +# Time Complexity +# +# Time Complexity: O(N) since we have a loop from N−2 and we use the precalculated +# values of our dynamic programming table to calculate the current value in the table +# which is a constant time operation. +# +# Space Complexity: O(1) since we are not using a table to store our values. +# Simply using two variables will suffice for our calculations. +# + +def rob(nums) + dp = Array.new(nums.size + 1) + + (nums.size + 1).times do |i| + dp[i] = if i == 0 + 0 + elsif i == 1 + nums[0] + else + [dp[i - 2] + nums[i - 1], dp[i - 1]].max + end + end + + dp[-1] +end + +nums = [1, 2, 3, 1] +puts rob(nums) +# Output: 4 + +nums = [2, 7, 9, 3, 1] +puts rob(nums) +# Output: 12