滑动窗口。。 想着一直移动左边界 右边界随i 但是时间上貌似执行时间比较长
下边是优化版本
func numSubarrayProductLessThanK(_ nums: [Int], _ k: Int) -> Int {
if k <= 0 {
return 0
}
var left = 0
var count = 0
while left != nums.count {
var product = 1
for i in left..<nums.count {
product *= nums[i]
if product < k{
count += 1
}
else {
left += 1
break
}
if i == nums.count - 1 {
left += 1
break
}
}
}
return count
}
比如某次遍历符合题意的子数组为 ABCX,那么在该条件下符合条件的有X,CX,BCX,ABCX共四个(可以进行多个例子,发现个数符合right-left+1)
所谓的规律。。可以减少循环,减少时间
k可以用1开始判断
func numSubarrayProductLessThanK(_ nums: [Int], _ k: Int) -> Int {
if k <= 1 {
return 0
}
var left = 0
var count = 0
var product = 1
for i in 0..<nums.count {
product *= nums[i]
while left <= i && product >= k {
product /= nums[left]
left += 1
}
count += i >= left ? ( i - left + 1 ): 0
}
return count
}
}
网友评论