剑指-和大于或等于k的最短子数组(Swift)

62 阅读1分钟

题目

输入一个正整数组成的数组和一个正整数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
    }
}