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

58 lines
1.6 KiB
Markdown

# 数组
## 二分
```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
```