diff --git a/README.md b/README.md index 2fd88dc..4307d8c 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ Dynamic programming is a strategy for developing an algorithm where each subproblem is solved and the results recorded for use in solving larger problems. In this exercise you will write a pair of dynamic programming methods. +**Due March 30th 7pm** + ## Wave 1 Newman-Conway Sequence [Newman-Conway sequence] is the one which generates the following integer sequence. 1 1 2 2 3 4 4 4 5 6 7 7….. and follows below recursive formula. diff --git a/lib/max_subarray.rb b/lib/max_subarray.rb index 5204edb..32da01a 100644 --- a/lib/max_subarray.rb +++ b/lib/max_subarray.rb @@ -2,7 +2,49 @@ # Time Complexity: ? # Space Complexity: ? def max_sub_array(nums) - return 0 if nums == nil + return nil if nums.nil? || nums.empty? + return nums[0] if nums.length == 1 + + current_max = global_max = nums[0] + index = 1 - raise NotImplementedError, "Method not implemented yet!" + until index == nums.length + # binding.pry + if nums[index] > current_max + nums[index] + current_max = nums[index] + else + current_max += nums[index] + end + + global_max = current_max if current_max > global_max + index += 1 + end + + return global_max + end + +# Write a method to find the contiguous subarray in a 1-dimensional array with the largest sum. +# This can be solved using Kadane's Algorithm + +# + +# ``` +# Initialize: +# max_so_far = 0 +# max_ending_here = 0 + +# Loop for each element of the array +# (a) max_ending_here = max_ending_here + a[i] +# (b) if(max_ending_here < 0) +# max_ending_here = 0 +# (c) if(max_so_far < max_ending_here) +# max_so_far = max_ending_here +# return max_so_far +# ``` + +# ### Explanation + +# The idea of the Kadane’s algorithm is to look for all positive contiguous segments of the array (max_ending_here is used for this). And keep track of the maximum sum contiguous segment among all positive segments (max_so_far is used for this). Each time we get a positive sum compare it with max_so_far and update max_so_far if it is greater than max_so_far + +# There is also a subtle divide & conquer algorithm for this. \ No newline at end of file diff --git a/lib/newman_conway.rb b/lib/newman_conway.rb index 4c985cd..f271dd7 100644 --- a/lib/newman_conway.rb +++ b/lib/newman_conway.rb @@ -1,7 +1,34 @@ +require 'pry' +# P(n) = P(P(n - 1)) + P(n - P(n - 1)) +# Eg 1 +# Input : 13 +# Output : 1 1 2 2 3 4 4 4 5 6 7 7 8 + +# Input : 20 +# Output : 1 1 2 2 3 4 4 4 5 6 7 7 8 8 8 8 9 10 11 12 # Time complexity: ? # Space Complexity: ? def newman_conway(num) - raise NotImplementedError, "newman_conway isn't implemented" -end \ No newline at end of file + + if num <= 0 + raise ArgumentError.new + end + + sequence = [] + + num.times do |i| + + if i < 2 + sequence << 1 + else + prev = sequence[i - 1] + sequence << sequence[prev - 1] + sequence[i - prev] + end + end + + return sequence.join(" ") +end + + \ No newline at end of file diff --git a/test/max_sub_array_test.rb b/test/max_sub_array_test.rb index 3253cdf..e27e1ca 100644 --- a/test/max_sub_array_test.rb +++ b/test/max_sub_array_test.rb @@ -1,6 +1,6 @@ require_relative "test_helper" -xdescribe "max subarray" do +describe "max subarray" do it "will work for [-2,1,-3,4,-1,2,1,-5,4]" do # Arrange input = [-2,1,-3,4,-1,2,1,-5,4] diff --git a/test/newman_conway_test.rb b/test/newman_conway_test.rb index 537d376..6a42001 100644 --- a/test/newman_conway_test.rb +++ b/test/newman_conway_test.rb @@ -1,6 +1,6 @@ require_relative "test_helper" -describe "Newman Conway Tests" do +xdescribe "Newman Conway Tests" do it "works with 13" do # Arrange input = 13