美文网首页
Python算法-滑动窗口Ⅱ(Sliding Window)

Python算法-滑动窗口Ⅱ(Sliding Window)

作者: ShowMeCoding | 来源:发表于2021-12-23 17:32 被阅读0次
    76. 最小覆盖子串

    给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
    注意:
    对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
    如果 s 中存在这样的子串,我们保证它是唯一的答案。

    输入:s = "ADOBECODEBANC", t = "ABC"
    输出:"BANC"

    # 变长度的滑动窗口
    import collections
    class Solution:
        def minWindow(self, s: str, t: str) -> str:
            left = 0
            right = 0
            count = 0    # 用来统计相同字符
            start = 0    # 数组的开始位置
            size = len(s) + 1
            
            # 创建目标字符串t 的字典
            t_dict = collections.defaultdict(int)
            for i in t:
                t_dict[i] += 1
            # 创建滑动窗口window 的字典
            window = collections.defaultdict(int)
            
            while right < len(s):
                insert_char = s[right]
                right += 1
                # 窗口字典更新
                if insert_char in t_dict:
                    window[insert_char] += 1
                    if window[insert_char] == t_dict[insert_char]:
                        count += 1
                
                # 窗口左边界右移
                while count == len(t_dict):
                    # 移动带来的数据更新
                    if right - left < size:
                        start = left
                        size = right - left
                    remove_char = s[left]
                    left += 1
    
                    if remove_char in t_dict:
                        if window[remove_char] == t_dict[remove_char]:
                            count -= 1
                        window[remove_char] -= 1
            if size == len(s) + 1:
                return ''
            return s[start: start+size]
    
    1658. 将 x 减到 0 的最小操作数

    输入:nums = [1,1,4,2,3], x = 5
    输出:2
    解释:最佳解决方案是移除后两个元素,将 x 减到 0 。

    输入:nums = [5,6,7,8,9], x = 4
    输出:-1

    # 滑动窗口
    # 将 x 减到 0 的最小操作数可以转换为求和等于 sum(nums) - x 的最长连续子数组长度。
    # 可以维护一个区间和为 sum(nums) - x 的滑动窗口,求出最长的窗口长度
    class Solution:
        def minOperations(self, nums: List[int], x: int) -> int:
            target = sum(nums) - x
            # 特殊情况
            if target < 0:
                return -1
            if target == 0:
                return len(nums)
    
            left = 0
            right = 0
            window_sum = 0
            maxlen = float('-inf')
    
            while right < len(nums):
                window_sum += nums[right]
                # 窗口左移
                while window_sum > target:
                    window_sum -= nums[left]
                    left += 1 
                # 维护窗口的最大长度
                if window_sum == target:
                    maxlen = max(maxlen, right-left+1)
                right += 1
            if maxlen == float('-inf'):
                return -1 
            else:
                return len(nums) - maxlen
    

    相关文章

      网友评论

          本文标题:Python算法-滑动窗口Ⅱ(Sliding Window)

          本文链接:https://www.haomeiwen.com/subject/yofhaltx.html