Réimprimé : Modèle de fenêtre coulissante

def findSubArray(nums):
    N = len(nums) # 数组/字符串长度
    left, right = 0, 0 # 双指针,表示当前遍历的区间[left, right],闭区间
    sums = 0 # 用于统计 子数组/子区间 是否有效,根据题目可能会改成求和/计数
    res = 0 # 保存最大的满足题目要求的 子数组/子串 长度
    while right < N: # 当右边的指针没有搜索到 数组/字符串 的结尾
        sums += nums[right] # 增加当前右边指针的数字/字符的求和/计数
        while 区间[left, right]不符合题意: # 此时需要一直移动左指针,直至找到一个符合题意的区间
            sums -= nums[left] # 移动左指针前需要从counter中减少left位置字符的求和/计数
            left += 1 # 真正的移动左指针,注意不能跟上面一行代码写反
        # 到 while 结束时,我们找到了一个符合题意要求的 子数组/子串
        res = max(res, right - left + 1) # 需要更新结果
        right += 1 # 移动右指针,去探索新的区间
    return res

作者:负雪明烛
链接:https://leetcode.cn/problems/max-consecutive-ones-iii/solutions/609055/fen-xiang-hua-dong-chuang-kou-mo-ban-mia-f76z/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Les pointeurs gauche et droit sont utilisés dans la fenêtre coulissante, et l'idée de leur mouvement est la suivante : le pointeur droit est utilisé comme lecteur et le pointeur gauche est déplacé vers l'avant. Le pointeur droit ne se déplace que d'un pas à la fois, tandis que le pointeur gauche peut se déplacer de plusieurs pas à la fois dans la boucle while interne. Le pointeur droit avance activement pour explorer de nouvelles zones inconnues ; le pointeur gauche est obligé de se déplacer et est chargé de trouver un intervalle qui satisfait le sens de la question.

L'idée générale du modèle est la suivante :

    Définissez deux pointeurs, gauche et droite, pour pointer respectivement vers le début et la fin de l'intervalle, notez qu'il s'agit d'un intervalle fermé ; définissez des sommes pour compter le nombre d'occurrences de chaque caractère dans l'intervalle ; la première boucle while sert à juger si la position du pointeur droit dépasse la
    limite du tableau ; lorsque la droite atteint une nouvelle position à chaque fois, la somme/compte du pointeur droit doit être augmentée ; la deuxième
    boucle while consiste à déplacer le pointeur gauche vers la droite jusqu'à une position dans l'intervalle [gauche, droite] qui correspond au sens de la question ; lorsque la gauche se déplace à chaque fois À la nouvelle position, la somme/compte du pointeur gauche doit être réduite ; après la deuxième boucle while, une [gauche,
    droite ] intervalle qui répond à la signification de la question est trouvé avec succès, et la question nécessite la plus grande longueur d'intervalle, donc mettez à jour res à max( res, la longueur de l'intervalle actuel).
    Le pointeur droit se déplace d'un pas vers la droite à chaque fois pour commencer à explorer un nouvel intervalle.

Les sommes dans le modèle doivent être modifiées en fonction de la signification du titre. Cette question est une question de sommation, donc les sommes sont définies comme un nombre entier pour la sommation ; s'il s'agit d'une question de comptage, elle doit être remplacée par un dictionnaire pour compte. Lorsque les pointeurs gauche et droit changent, les sommes doivent être mises à jour.

Une autre chose qui doit être modifiée selon le sujet est la condition de jugement de la boucle while interne, c'est-à-dire : l'intervalle [gauche, droite] ne correspond pas à la signification du sujet.

Auteur : Negative Xue Mingzhu
Lien : https://leetcode.cn/problems/max-consecutive-ones-iii/solutions/609055/fen-xiang-hua-dong-chuang-kou-mo-ban-mia-f76z/
Source : Le droit d'auteur LeetCode
appartient à l'auteur. Pour une réimpression commerciale, veuillez contacter l'auteur pour autorisation, pour une réimpression non commerciale, veuillez indiquer la source.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45314061/article/details/130449789
conseillé
Classement