0
点赞
收藏
分享

微信扫一扫

【LeetCode】209. 长度最小的子数组

0 总结

  • 一道题可以有很多实现方式,最优的不一定是最好的。可能有些实现起来较难的,才是值得学习的。

1 题目

【LeetCode】209. 长度最小的子数组_算法

2 思想

2.1 前缀和+遍历

使用前缀和来解决这道题,双重循环找出满足题意的最小子数组,复杂度是O(nm),其中m是满足连续和 ​​>=target​​ 的最小序列长度。这种方法(我的想法)同后面两种方法相比,实在是差。

2.2 前缀和+滑动窗口

其实这题最好使用滑动窗口的方法,时间复杂度最低。

2.3 前缀和+二分法

待更新

3 代码

3.1

如下代码对应 前缀和+遍历 的思想

class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
pre_sum = [0] * (len(nums)+1)
nums = [0] + nums # 前面补了一个0
pre_sum[0] = nums[0]
for i in range(1,len(nums)):
pre_sum[i] = pre_sum[i-1] + nums[i]
if target <= nums[i]:
return 1

if pre_sum[-1] < target:
return 0
elif pre_sum[-1] == target:
return len(nums)-1
else:
length = len(nums)
for i in reversed(range(len(nums))):
for j in reversed(range(0,i-1)): # 寻找一个区间
if (j+length <= i): # 如果区间已经超过了 length,已经不是最优解
break
# print(i,j,pre_sum[i] - pre_sum[j])
if pre_sum[i] - pre_sum[j] >=target:
length = min(length,i-j)
break
return length


举报

相关推荐

0 条评论