Prenez l'habitude d'écrire ensemble ! C'est le troisième jour de ma participation au "Nuggets Daily New Plan · April Update Challenge", cliquez pour voir les détails de l'événement .
salutation quotidienne
La fermeture récente de l'école en raison de l'épidémie et l'interdiction des achats en ligne sont tellement inconfortables, mais vous devez aussi ajuster votre humeur et continuer à parfaire votre pratique. A la fin de la période difficile, je dois m'amuser quelques jours après la fin de l'épidémie.
209. Sous-réseau de longueur minimale
Difficulté : Modérée
Étant donné un n
tableau d'entiers positifs et un entier positif target
.
Trouver ≥ target
le plus petit sous-tableau contigu [numsl, numsl+1, ..., numsr-1, numsr]
dans le tableau qui satisfait sa somme et renvoyer sa longueur . Retourne si aucun sous-tableau correspondant n'existe 0
.
Exemple 1:
输入: target = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的子数组。
复制代码
Exemple 2 :
输入: target = 4, nums = [1,4,4]
输出: 1
复制代码
Exemple 3 :
输入: target = 11, nums = [1,1,1,1,1,1,1,1]
输出: 0
复制代码
pense:
1. Tout d'abord, vous devez comprendre float('inf') : comprenez-le directement comme un infini positif, si -inf est un infini négatif.
2. Généralement, il est utilisé sur des tableaux ou des chaînes de caractères. Comprenons d'abord littéralement la fenêtre glissante :
- Glissement : La fenêtre peut être déplacée dans une certaine direction. \
- Fenêtre : la taille de la fenêtre peut être fixe ou non. À ce stade, vous pouvez agrandir ou réduire la fenêtre vers l'extérieur ou vers l'intérieur jusqu'à ce que les conditions soient remplies.
3. Étapes de résolution de problèmes :
- En utilisant les pointeurs gauche et droit, la longueur entre gauche et droite est la taille de la fenêtre glissante (c'est-à-dire la taille d'un tableau continu).
- Si la valeur dans la somme de la fenêtre glissante >= cible, conservez la longueur la plus courte du tableau continu, déplacez la gauche vers la droite et réduisez la fenêtre glissante.
- Si la valeur dans la somme de la fenêtre glissante < cible, la bonne direction se déplace pour agrandir la fenêtre glissante.
Ma solution (facile à comprendre, pensée masculine droite):
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
lowsum=0
for i in range(0,len(nums)):
lowsum+=nums[i]
if lowsum<s:
return 0
#滑动窗格解法
left=0
right=0
min_len=float('inf')
sum=0
while right<len(nums):
sum+=nums[right]
while sum >= s:
min_len=min(min_len,right-left+1)
sum-=nums[left]
left+=1
right+=1
return min_len
复制代码
La réponse officielle (comme une petite fille délicate) :
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
if not nums:
return 0
n = len(nums)
# 滑动窗口左右边界
left = right = 0
# 记录当前元素和
sum = 0
# 记录最短长度
min_len = float('inf')
while right < n:
sum += nums[right]
# 如果当前元素和 >= s
while sum >= s:
# 取之前窗口长度和当前窗口长度最短的
min_len = min(min_len, right - left + 1)
# 去掉左侧的数
sum -= nums[left]
# 缩小窗口
left += 1
right += 1
# 如果整个数组所有元素的和相加都 < s
# 即不存在符合条件的子数组,返回 0
if min_len == float('inf'):
return 0
else:
return min_len
复制代码