package main
import "fmt"
func canFindSubarray(arr []int, length int, target int) bool {
sum := 0
for i := 0; i < length; i++ {
sum += arr[i] // sum first 'length' elements
}
if sum <= target {
return true
}
for i := length; i < len(arr); i++ {
sum += arr[i] - arr[i-length] // slide window
if sum <= target {
return true
}
}
return false
}
func binarySearchOnAnswer(arr []int, target int) int {
low, high := 1, len(arr)
result := 0
for low <= high {
mid := (low + high) / 2
if canFindSubarray(arr, mid, target) {
result = mid // mid length works, try longer
low = mid + 1
} else {
high = mid - 1 // mid length too long, try shorter
}
}
return result
}
func main() {
arr := []int{1, 2, 3, 4, 5}
target := 8
fmt.Printf("Longest valid subarray length = %d\n", binarySearchOnAnswer(arr, target))
}
binary search loop to narrow down answer range
guess middle length to test
if canFindSubarray(arr, mid, target) {
check if subarray of length mid meets sum condition
result = mid // mid length works, try longer
record valid length and try longer
increase lower bound to search longer lengths
high = mid - 1 // mid length too long, try shorter
decrease upper bound to search shorter lengths
sum += arr[i] - arr[i-length] // slide window
update sum for next subarray by sliding window
Longest valid subarray length = 3