目前的理解,双指针,滑动窗口就是左右指针之间的窗口,指针可以左右移动。然后用一些条件决定是哪边的指针移动,是向左还是向右移动,移动多少。
力扣209 长度最小的子数组
题目描述:
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
# 滑动窗口的思想,双指针
n = len(nums)
ans = n + 1
s = 0
left = 0
for right, x in enumerate(nums): # x = nums[right]
# 每次将右端点包括进去,然后左端点不断右移直到不再满足需求
s += x
# while s - nums[left] >= target:
# s -= nums[left]
# left += 1
# if s >= target:
# ans = min(ans, right - left + 1)
# 另一种写法
while s >= target:
ans = min(ans, right - left + 1)
s -= nums[left]
left += 1
return ans if ans <= n else 0
力扣3 无重复字符的最长子串
题目描述:
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# hashmap key:char value:int
ans = 0
cnt = Counter() # 哈希表记录的是字符出现的次数
left = 0
for right,x in enumerate(s):
# 每次都将右边的值包括进去,更新左端点
cnt[x] += 1
while cnt[x] > 1:
cnt[s[left]] -= 1
left += 1
ans = max(ans, right - left + 1)
return ans
力扣713 乘积小于K的子数组
题目描述:
给你一个整数数组 nums
和一个整数 k
,请你返回子数组内所有元素的乘积严格小于 k
的连续子数组的数目。
输入:nums = [10,5,2,6], k = 100
输出:8
解释:8 个乘积小于 100 的子数组分别为:[10]、[5]、[2]、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。 需要注意的是 [10,5,2] 并不是乘积小于 100 的子数组。
class Solution:
def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
# 同209
if k <= 1:
return 0
n = len(nums)
prod = 1
left = 0
ans = 0
for right, x in enumerate(nums):
prod *= x
while prod >= k:
prod /= nums[left]
left += 1
ans += right - left + 1
return ans