Files
Obsidian/Books/代码随想录/代码模版.md

1.6 KiB

数组

二分

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

滑动窗口

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