0 总结
- 一道题可以有很多实现方式,最优的不一定是最好的。可能有些实现起来较难的,才是值得学习的。
1 题目
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