Study Plan For Algorithms - Part38

1. 颜色分类
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

  • 使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
  • 不使用库内置的 sort 函数的情况下解决这个问题。
class Solution:
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        left = 0
        right = len(nums) - 1
        i = 0

        while i <= right:
            if nums[i] == 0:
                nums[i], nums[left] = nums[left], nums[i]
                left += 1
                i += 1
            elif nums[i] == 2:
                nums[i], nums[right] = nums[right], nums[i]
                right -= 1
            else:
                i += 1

2. 最小覆盖子串
给定一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

from collections import Counter
class Solution:
    def minWindow(self, s: str, t: str) -> str:
        if not s or not t:
            return ""

        target_count = Counter(t)
        window_count = Counter()
        left, right = 0, 0
        min_window = ""
        min_length = float('inf')
        match_count = 0

        while right < len(s):
            window_count[s[right]] += 1
            if s[right] in target_count and window_count[s[right]] == target_count[s[right]]:
                match_count += 1

            while match_count == len(target_count):
                if right - left + 1 < min_length:
                    min_length = right - left + 1
                    min_window = s[left:right + 1]

                window_count[s[left]] -= 1
                if s[left] in target_count and window_count[s[left]] < target_count[s[left]]:
                    match_count -= 1
                left += 1

            right += 1

        return min_window
posted @ 2024-09-23 02:20  WindMay  阅读(0)  评论(0编辑  收藏  举报