From aa2b2e9163ec3c9e8998ee90f95375886c79d32d Mon Sep 17 00:00:00 2001 From: kr0st Date: Mon, 22 Jan 2024 23:44:53 +0200 Subject: [PATCH] 2902 - Count of Sub-Multisets With Bounded Sum, saving work --- 2902-count-sub-multisets-with-bounded-sum.go | 84 ++++++++++++++------ 1 file changed, 59 insertions(+), 25 deletions(-) diff --git a/2902-count-sub-multisets-with-bounded-sum.go b/2902-count-sub-multisets-with-bounded-sum.go index 2c9e8ab..872250b 100644 --- a/2902-count-sub-multisets-with-bounded-sum.go +++ b/2902-count-sub-multisets-with-bounded-sum.go @@ -1,30 +1,64 @@ package main -func countSubMultisetsBrute(nums []int, l int, r int) int { - ln := len(nums) - count := 0 - for i := 0; i < ln; i++ { - sum := nums[i] - if sum >= l && sum <= r { - count++ - } else { - continue - } - for j := 0; j < ln; j++ { - if i == j { - continue - } - sum += nums[j] - if sum >= l && sum <= r { - count++ - } else { - break - } - } - } - return count +import ( + "fmt" + "sort" +) + +type NumberRange struct { + Start, Stop int } -func CountSubMultisets(nums []int, l int, r int) int { - return countSubMultisetsBrute(nums, l, r) +type NumberCount struct { + Num, Count int +} + +type DistinctRange map[int]NumberRange + +func CountSubMultisets(nums []int, l int, r int) int { + numLen := len(nums) + if numLen == 0 { + return 0 + } + + if l > r { + return 0 + } + + sort.Ints(nums) + fmt.Println(nums) + + if nums[0] > r { + return 0 + } + + if numLen*nums[numLen-1] < l { + return 0 + } + + ranges := make(DistinctRange) + + CurrentNum := nums[0] + CurrentRange := NumberRange{0, 0} + ranges[CurrentNum] = CurrentRange + + for i := 1; i < numLen; i++ { + if nums[i] > r { + numLen = i + break + } + r := ranges[nums[i]] + if CurrentNum == nums[i] { + r.Stop = i + } else { + CurrentNum = nums[i] + r = NumberRange{i, i} + } + ranges[CurrentNum] = r + } + + fmt.Println(ranges) + result := 0 + + return result }