Question du jour - leecode209 (sous-tableau avec la plus petite longueur)

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  ntableau d'entiers positifs et un entier positif  target .

Trouver ≥ targetle  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 :

  1. Glissement : La fenêtre peut être déplacée dans une certaine direction. \
  2. 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

复制代码

Je suppose que tu aimes

Origine juejin.im/post/7082211056566665246
conseillé
Classement