leetcode刷题四十一
  TEZNKK3IfmPf 2023年11月14日 31 0

给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。

示例 1:

输入:nums = [10,5,2,6], k = 100
输出:8

题目初次解答

这个解答确实是实现了我们所需要的效果,但是超出了时间的限制,运行不能通过。

class Solution:
def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
res = []
n = 0
l = len(nums)
for i in range(l):
for j in range(i + 1, l + 1):
res.append(nums[i:j])
# print(res)
for a in res:
m = 1
for b in a:
m *= b
if m < k:
n += 1
return

题目解答

class Solution:
def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:

if k <= 1: return 0
left, right, multi, ans = 0, 0, 1, 0

while right < len(nums):
multi *= nums[right]
while multi >= k:
multi //= nums[left]
left += 1
ans += right - left + 1
right += 1
return

题目运行结果

class Solution:
def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
# 使用移动的窗的形式来进行计算,这样可减少计算的次数,也就是可以减少时间上的复杂度。

if k <= 1: return 0
left, right, multi, ans = 0, 0, 1, 0

while right < len(nums):
multi *= nums[right]
# 以右侧元素为pivot
while multi >= k:
# 找到对应这个pivot的最长窗口左侧点
multi //= nums[left]
left += 1
ans += right - left + 1
# 统计以pivot为右侧元素的子数组
right += 1
return

leetcode刷题四十一

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月17日   25   0   0 编程
  TEZNKK3IfmPf   2024年04月12日   36   0   0 算法leetcodeC++
  TEZNKK3IfmPf   2024年04月19日   51   0   0 leetcode位运算
TEZNKK3IfmPf