# 时间复杂度 O(log n),空间复杂度 O(log n) 递归栈
def binary_search(arr, target):
def helper(l, r):
if l > r: return -1
m = (l + r) // 2
if arr[m] == target: return m
if arr[m] < target: return helper(m+1, r)
return helper(l, m-1)
return helper(0, len(arr)-1)
🚀 阶段4 · 迁移练习:LeetCode 713 乘积小于 K 的子数组
迁移题: 给定正整数数组 nums 和整数 k,返回乘积小于 k 的连续子数组个数。
示例: nums=[10,5,2,6], k=100 → 8
保留点: 滑动窗口、右指针扩展、左指针收缩。
变化点: 从“和”变为“乘积”,计数方式为 right-left+1。
🔧 算法拼装
① 初始化:left=0, product=1, ans=0left=0, product=0, ans=0left=0, product=1, ans=1
② 循环条件:for right in range(len(nums))while left < len(nums)for right in range(1, len(nums))
③ 更新乘积:product *= nums[right]product += nums[right]product = nums[right]
④ 收缩条件:while product >= k and left <= right:while product > k:if product >= k:
def numSubarrayProductLessThanK(nums, k):
if k <= 1: return 0
left = 0; product = 1; ans = 0
for right in range(len(nums)):
product *= nums[right]
while product >= k:
product //= nums[left]
left += 1
ans += right - left + 1
return ans