leetcode|leetcode 209(长度最小的子数组)
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
示例:
输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。
进阶:
如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。
做这道题的时候,一直不知道怎么做,看到讨论区有人用双指针做了于是也尝试了一下,成功了。
记录一下。
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
if not nums: return 0
if sum(nums) < s: return 0
l = 0
r = 0
val = 0#记录两个指针中间数的和
res = len(nums)
while l < len(nums):
if r < len(nums) and val < s: #如果和小于s,加上右指针指向的数,右指针右移
val += nums[r]
r += 1
else: #否则减去左指针的数,左指针右移
val -= nums[l]
l += 1
if val >= s: #更新最小长度
res = min(res, r-l)
return res
【leetcode|leetcode 209(长度最小的子数组)】但是这个写下来之后运行时间不短,只超过了55%,于是又去评论区偷看了一下。
看到大佬一种O(n)的方法,偷一下。99.8%。
其实思路差不多。
class Solution:
def minSubArrayLen(self, s, nums):
total = left = 0
result = len(nums) + 1
for right, n in enumerate(nums):
total += n
while total >= s:
result = min(result, right - left + 1) #更新最小长度
total -= nums[left]
left += 1
return result if result <= len(nums) else 0
推荐阅读
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- leetcode|leetcode 92. 反转链表 II
- 二叉树路径节点关键值和等于目标值(LeetCode--112&LeetCode--113)
- LeetCode算法题-11.|LeetCode算法题-11. 盛最多水的容器(Swift)
- LeetCode(03)Longest|LeetCode(03)Longest Substring Without Repeating Characters
- Leetcode|Leetcode No.198打家劫舍
- [leetcode数组系列]1两数之和
- 零长度数组与柔性数组
- 数据结构和算法|LeetCode 的正确使用方式
- leetcode|今天开始记录自己的力扣之路