From 06cce0382b77d16c7b3e9a7205a4a9b847eb7aa4 Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Fri, 28 Feb 2020 16:24:18 -0700 Subject: [PATCH] day 464: cleaned up day 198 --- day464/problem.go | 52 ++++++++++++++++++++++++++++++++++++++++++ day464/problem_test.go | 34 +++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 day464/problem.go create mode 100644 day464/problem_test.go diff --git a/day464/problem.go b/day464/problem.go new file mode 100644 index 0000000..df772d7 --- /dev/null +++ b/day464/problem.go @@ -0,0 +1,52 @@ +package day464 + +import ( + "sort" +) + +// LargestSubsetPairs finds the largest subset +// such that every pair of elements in the subset (i, j) +// satisfies either i % j = 0 or j % i = 0. +// Runs in O(N^2) time +func LargestSubsetPairs(nums []int) []int { + sort.Slice(nums, func(i, j int) bool { + return nums[i] < nums[j] + }) + + dp := make([]int, len(nums)) + dp[len(dp)-1] = 1 + largestI, largestVal := 0, 0 + + for i := len(dp) - 2; i >= 0; i-- { + m := 0 + + for j := i + 1; j < len(dp); j++ { + if nums[j]%nums[i] == 0 { + m = max(m, dp[j]) + } + } + + if dp[i] = 1 + m; dp[i] > largestVal { + largestI = i + largestVal = dp[i] + } + } + + result := make([]int, 0, largestVal) + + for i := largestI; i < len(nums); i++ { + if nums[i]%nums[largestI] == 0 { + result = append(result, nums[i]) + } + } + + return result +} + +func max(a, b int) int { + if a > b { + return a + } + + return b +} diff --git a/day464/problem_test.go b/day464/problem_test.go new file mode 100644 index 0000000..5087732 --- /dev/null +++ b/day464/problem_test.go @@ -0,0 +1,34 @@ +package day464 + +import ( + "reflect" + "testing" +) + +// nolint +var testcases = []struct { + nums, subset []int +}{ + {[]int{3, 5, 10, 20, 21}, []int{5, 10, 20}}, + {[]int{1, 3, 6, 24}, []int{1, 3, 6, 24}}, +} + +func TestLargestSubsetPairs(t *testing.T) { + t.Parallel() + + for _, tc := range testcases { + input := append([]int{}, tc.nums...) + if result := LargestSubsetPairs(input); !reflect.DeepEqual(result, tc.subset) { + t.Errorf("Expected %v, got %v", tc.subset, result) + } + } +} + +func BenchmarkLargestSubsetPairs(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, tc := range testcases { + input := append([]int{}, tc.nums...) + LargestSubsetPairs(input) + } + } +}