"Maximum Fruits Harvested After at Most K Steps" not yet accepted, wrong answer
This commit is contained in:
114
2106-max-fruits-harvested-in-k-steps.go
Normal file
114
2106-max-fruits-harvested-in-k-steps.go
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func MaxTotalFruits(fruits [][]int, startPos int, k int) int {
|
||||||
|
if len(fruits) == 0 || k < 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
totalLength := fruits[len(fruits)-1][0] + 1
|
||||||
|
//fmt.Println("totalLength = ", totalLength)
|
||||||
|
|
||||||
|
if startPos >= totalLength {
|
||||||
|
totalLength = startPos + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
fruitySlice := make([]int, totalLength)
|
||||||
|
fruityPrefix := make([]int, totalLength)
|
||||||
|
|
||||||
|
for _, fruit := range fruits {
|
||||||
|
fruitySlice[fruit[0]] = fruit[1]
|
||||||
|
}
|
||||||
|
//fmt.Println("fruitySlice = ", fruitySlice)
|
||||||
|
|
||||||
|
if k == 0 {
|
||||||
|
return fruitySlice[startPos]
|
||||||
|
}
|
||||||
|
|
||||||
|
prefixSum := 0
|
||||||
|
for i, fruit := range fruitySlice {
|
||||||
|
prefixSum += fruit
|
||||||
|
fruityPrefix[i] = prefixSum
|
||||||
|
}
|
||||||
|
//fmt.Println("fruityPrefix = ", fruityPrefix)
|
||||||
|
|
||||||
|
leftLimit := startPos - k
|
||||||
|
if leftLimit < 0 {
|
||||||
|
leftLimit = 0
|
||||||
|
}
|
||||||
|
//fmt.Println("leftLimit = ", leftLimit)
|
||||||
|
|
||||||
|
rightLimit := startPos + k
|
||||||
|
if rightLimit >= totalLength {
|
||||||
|
rightLimit = totalLength - 1
|
||||||
|
}
|
||||||
|
//fmt.Println("rightLimit = ", rightLimit)
|
||||||
|
|
||||||
|
windowSize := k / 2
|
||||||
|
|
||||||
|
calcFruitySliceSum := func(begin int, end int) int {
|
||||||
|
begin--
|
||||||
|
if begin < 0 {
|
||||||
|
return fruityPrefix[end]
|
||||||
|
}
|
||||||
|
|
||||||
|
return fruityPrefix[end] - fruityPrefix[begin]
|
||||||
|
}
|
||||||
|
|
||||||
|
maxFruits := calcFruitySliceSum(startPos, rightLimit)
|
||||||
|
|
||||||
|
windowBegin := startPos - (k - windowSize*2) // in case number of steps cannot be fully divided by 2, start position is shifted 1 position to the left
|
||||||
|
windowEnd := windowBegin + windowSize + (k - windowSize*2) // for odd numbers of k we need to adjust wnd sz +1
|
||||||
|
|
||||||
|
if windowEnd >= rightLimit {
|
||||||
|
windowEnd = rightLimit
|
||||||
|
}
|
||||||
|
|
||||||
|
endCycle := false
|
||||||
|
for !endCycle {
|
||||||
|
if windowBegin <= leftLimit {
|
||||||
|
windowBegin = leftLimit
|
||||||
|
endCycle = true
|
||||||
|
}
|
||||||
|
|
||||||
|
localMaxFruits := calcFruitySliceSum(windowBegin, windowEnd)
|
||||||
|
if localMaxFruits > maxFruits {
|
||||||
|
maxFruits = localMaxFruits
|
||||||
|
}
|
||||||
|
|
||||||
|
windowSize++
|
||||||
|
windowEnd--
|
||||||
|
windowBegin = windowEnd - windowSize
|
||||||
|
}
|
||||||
|
|
||||||
|
alternativeMaxFruits := calcFruitySliceSum(leftLimit, startPos)
|
||||||
|
if alternativeMaxFruits > maxFruits {
|
||||||
|
maxFruits = alternativeMaxFruits
|
||||||
|
}
|
||||||
|
|
||||||
|
windowSize = k / 2
|
||||||
|
windowEnd = startPos + (k - windowSize*2)
|
||||||
|
windowBegin = windowEnd - windowSize - (k - windowSize*2)
|
||||||
|
|
||||||
|
if windowBegin <= leftLimit {
|
||||||
|
windowBegin = leftLimit
|
||||||
|
}
|
||||||
|
|
||||||
|
endCycle = false
|
||||||
|
for !endCycle {
|
||||||
|
if windowEnd >= rightLimit {
|
||||||
|
windowEnd = rightLimit
|
||||||
|
endCycle = true
|
||||||
|
}
|
||||||
|
|
||||||
|
localMaxFruits := calcFruitySliceSum(windowBegin, windowEnd)
|
||||||
|
if localMaxFruits > maxFruits {
|
||||||
|
maxFruits = localMaxFruits
|
||||||
|
}
|
||||||
|
|
||||||
|
windowSize++
|
||||||
|
windowBegin++
|
||||||
|
windowEnd = windowBegin + windowSize
|
||||||
|
}
|
||||||
|
|
||||||
|
return maxFruits
|
||||||
|
}
|
||||||
16
2106-max-fruits-harvested-in-k-steps_test.go
Normal file
16
2106-max-fruits-harvested-in-k-steps_test.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMaxTotalFruits(t *testing.T) {
|
||||||
|
|
||||||
|
/*assert.Equal(t, 9, MaxTotalFruits([][]int{{2, 8}, {6, 3}, {8, 6}}, 5, 4))
|
||||||
|
assert.Equal(t, 14, MaxTotalFruits([][]int{{0, 9}, {4, 1}, {5, 7}, {6, 2}, {7, 4}, {10, 9}}, 5, 4))
|
||||||
|
assert.Equal(t, 0, MaxTotalFruits([][]int{{0, 3}, {6, 4}, {8, 5}}, 3, 2))
|
||||||
|
assert.Equal(t, 10000, MaxTotalFruits([][]int{{0, 10000}}, 200000, 200000))
|
||||||
|
assert.Equal(t, 10000, MaxTotalFruits([][]int{{200000, 10000}}, 0, 200000))*/
|
||||||
|
assert.Equal(t, 22, MaxTotalFruits([][]int{{1, 9}, {2, 10}, {3, 1}, {5, 6}, {6, 3}, {8, 2}, {9, 2}, {11, 4}, {18, 10}, {22, 8}, {25, 2}, {26, 2}, {30, 4}, {31, 5}, {33, 9}, {34, 1}, {39, 10}}, 19, 9))
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user