给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。
https://leetcode-cn.com/problems/minimum-size-subarray-sum
滑动窗口:
left 和right滑动,找出所有符合要求的窗口。使用min获取最小窗口
func minSubArrayLen(s int, nums []int) int {
length := len(nums)
left := 0
right := 0
sum := 0
number := length
for i := 0; i < length ; i++{
sum += nums[i]
}
if sum < s {
return 0
}
sum = 0
for i := 0; right < length ; i++{
for ;right < length && sum < s; {
sum += nums[right]
right++
}
for ;sum >= s; {
number = Min(right-left,number)
sum -= nums[left]
left++
}
}
return number
}
func Min(x, y int) int {
if x < y {
return x
}
return y
}
前缀和加二分法:
实现前缀和,为一个排序好的数组。转化为sum[i] - sum[k] > s ,k-i 的最小值。sum[i] > sum[k] +s 。在sum[i:len] 中使用二分法找到k。就可以计算出k-i
func minSubArrayLen(s int, nums []int) int {
length := len(nums)
find := 0
result := math.MaxInt32
sums := make([]int,length+1)
for i := 1; i < length+1 ; i++{
sums[i] += nums[i-1]+ sums[i-1]
}
for i := 1; i <= length; i++{
find = s+ sums[i-1]
bound := sort.SearchInts(sums, find)
fmt.Println(bound)
if bound <= length {
result = Min(result, bound - (i - 1))
}
}
if result == math.MaxInt32{
result = 0
}
return result
}
func Min(x, y int) int {
if x < y {
return x
}
return y
}
网友评论