三数之和 找出所有和为 0 且不重复的三元组
思路 总体排序 先固定一个点 设定下一个点和结尾点为双指针进行移动
def threeSum(nums): nums.sort() res, k [], 0 for k in range(len(nums) - 2): if nums[k] 0: break # 如果首元素大于0 结果不可能为0 if k 0 and nums[k] nums[k - 1]: continue # 固定点和前一个点值相同 跳过 i, j k 1, len(nums) - 1 while i j: s nums[k] nums[i] nums[j] if s 0: while i j and nums[i] nums[i - 1]: elif s 0: j - 1 while i j and nums[j] nums[j 1]: j - 1 else: res.append([nums[k], nums[i], nums[j]]) j - 1 while i j and nums[i] nums[i - 1]: while i j and nums[j] nums[j 1]: j - 1 return res76. 最小覆盖子串
最小覆盖子串:给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。 如果 s 中不存在涵盖 t 所有字符的子串 则返回空字符串 “”
思路 使用滑动窗口 不断弹出左边字母直到不满足条件右指针继续前进。使用need_match_len作为需要匹配字符的个数 为0说明满足覆盖条件。
from collections import defaultdict, Counter def minWindow(s, t): t_dict Counter(t) need_match_len len(t) res (0, float( inf )) left 0 for right in range(len(s)): if t_dict[s[right]] 0: need_match_len - 1 t_dict[s[right]] - 1 while need_match_len 0: if res[1] - res[0] right - left: res (left, right) t_dict[s[left]] 1 if s[left] in t and t_dict[s[left]] 0: need_match_len 1 left 1 return s[res[0]: res[1] 1] if res[1] - res[0] len(s) else



