713. 乘积小于 K 的子数组
这一题很像dp的思路,但是和求和最大的子数组又不太一样
用滑动窗口的思路不难,难点在于求数量这里,这个个数的求法很关键哈哈哈哈
pub fn num_subarray_product_less_than_k(nums: Vec<i32>, k: i32) -> i32 {let mut res = 0;if k<=1 { return 0; }// 用来记录滑动窗口内的值let mut cur = 1;let mut j = 0;for i in 0..nums.len() {cur *= nums[i];while cur >= k {cur /= nums[j];j += 1;}res += i - j + 1;}res as i32}
下面有一种迭代器fold写法:
impl Solution {pub fn num_subarray_product_less_than_k(nums: Vec<i32>, k: i32) -> i32 {if k <= 1 {return 0;}(0..nums.len()).fold((0, 0, 1), |(ans, mut l, mut prod), r| {prod *= nums[r];while prod >= k {prod /= nums[l];l += 1;}(ans + r - l + 1, l, prod)}).0 as i32}}
