From 286558e26300353759e6a4de698e362d79f2cb59 Mon Sep 17 00:00:00 2001 From: Yolotzin Dunbar Date: Tue, 20 Oct 2020 21:29:46 -0700 Subject: [PATCH] passed tests --- lib/max_subarray.rb | 45 +++++++++++++++++++++++++++++++++----- lib/newman_conway.rb | 40 +++++++++++++++++++++++++++++---- test/max_sub_array_test.rb | 2 +- 3 files changed, 77 insertions(+), 10 deletions(-) diff --git a/lib/max_subarray.rb b/lib/max_subarray.rb index 5204edb..1ab2e70 100644 --- a/lib/max_subarray.rb +++ b/lib/max_subarray.rb @@ -1,8 +1,43 @@ -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: O(n) +# Space Complexity: O(1) def max_sub_array(nums) - return 0 if nums == nil - - raise NotImplementedError, "Method not implemented yet!" + return nil if nums == nil || nums.empty? + return nums[0] if nums.length == 1 + max = nums[0] # start with first element and then skip in loop + current = nums[0] + i = 1 + while i < nums.length + current += nums[i] + if max < current + max = current + end + if current < 0 + current = 0 + end + i += 1 + end + return 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 + +# 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..320d359 100644 --- a/lib/newman_conway.rb +++ b/lib/newman_conway.rb @@ -1,7 +1,39 @@ -# Time complexity: ? -# Space Complexity: ? +# Time complexity: O(n) +# Space Complexity: O(n) def newman_conway(num) - raise NotImplementedError, "newman_conway isn't implemented" -end \ No newline at end of file + raise ArgumentError, 'must be number > 0' if num == 0 + return "1" if num == 1 + array = Array.new(num) + array[0] = 0 + array[1] = 1 + array[2] = 1 + i = 3 + while i <= num + array[i] = array[array[i - 1]] + array[i - array[i - 1]] + i += 1 + end + return array[1..num].join(' ') +end + + +# [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. + +# P(1) = 1 +# P(2) = 1 +# for all n > 2 +# P(n) = P(P(n - 1)) + P(n - P(n - 1)) +# Given a number n then print n terms of Newman-Conway Sequence + +# Examples: + +# 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 +# You should be able to do this in O(n) time complexity. + 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]