题目
输入一个正整数组成的数组和一个正整数k,请问数组中和大于或等于k的连续子数组的最短长度是多少?如果不存在所有数字之和大于或等于k的子数组,则返回0。例如,输入数组[5,1,4,3],k的值为7,和大于或等于7的最短连续子数组是[4,3],因此输出它的长度2。
解题思路
- 异常情况:如果数组为空,直接返回0.
- left/right 初始指向索引 0,初始 sum = 0。minlength = Int.max。外循环移动 right,循环条件为:
right < number.count; - 内层循环移动 left,循环条件:
left <= right && sum >= k,获取当次最小长度,然后 sum 减去 left 位置的值,left 右移一位。
代码实现
class MinLength {
static func minlength(_ numbers: [Int], _ k: Int) -> Int {
if numbers.isEmpty {
return 0
}
var left = 0
var right = 0
var sum = 0
var minLength = Int.max
while right < numbers.count {
sum += numbers[right]
while left <= right && sum >= k {
minLength = min(minLength, right - left + 1)
sum -= numbers[left]
left += 1
}
right += 1
}
return minLength == Int.max ? 0 : minLength
}
}