# 数组 ## 二分 ```python def binary_search(nums, target): left, right = 0, len(nums) - 1 while left <= right: mid = left + (right - left) // 2 # 防止溢出 if nums[mid] == target: return mid # 找到目标,返回索引 elif nums[mid] < target: left = mid + 1 # 目标在右半部分 else: right = mid - 1 # 目标在左半部分 return -1 # 未找到目标 # 左右边界 def left_bound(nums, target): left, right = 0, len(nums) - 1 while left <= right: mid = left + (right - left) // 2 if nums[mid] < target: left = mid + 1 else: right = mid - 1 return left if left < len(nums) and nums[left] == target else -1 def right_bound(nums, target): left, right = 0, len(nums) - 1 while left <= right: mid = left + (right - left) // 2 if nums[mid] <= target: left = mid + 1 else: right = mid - 1 return right if right >= 0 and nums[right] == target else -1 ``` ## 滑动窗口 ```python def lengthOfLongestSubstring(s: str) -> int: left = 0 window = {} result = 0 for right in range(len(s)): char_right = s[right] window[char_right] = window.get(char_right, 0) + 1 # 当窗口中有重复字符时,收缩窗口 while window[char_right] > 1: char_left = s[left] window[char_left] -= 1 if window[char_left] == 0: del window[char_left] left += 1 result = max(result, right - left + 1) return result ```