一、滑动窗口类
- 解题思路
1、滑动窗口的大小如何确定用也起点和终点, 累加或累减
2、设置滑动范围
3、滑动窗口
4、退出
1、 滑动窗口1:给定一个正数数组和一个正数k,找到大小为k的任何连续子数组的最大和。
def max_sub_array_of_size_k(k, arr):
max_sum = 0
windows_sum = 0
start = 0
for end in range(len(arr)):
windows_sum += arr[end]
if end >= k-1:
max_sum = max(windows_sum, max_sum)
windows_sum -= arr[start]
start += 1
return max_sum
arr = [2, 1, 5, 1, 3, 2]
k = 3
max_sub_array_of_size_k(k, arr)
# 返回9
2、滑动窗口2: 给定一个正数数组和一个正数S,找到其和大于或等于S的最小连续子数组的长度。如果不存在此类子数组,则返回0。
# 滑动窗口2: 给定一个正数数组和一个正数S,找到其和大于或等于S的最小连续子数组的长度。如果不存在此类子数组,则返回0。
import math
def smallest_subarray_with_given_sum(s, arr):
window_start = 0
min_len = math.inf
window_sum = 0
for window_end in range(0, len(arr)):
window_sum += arr[window_end]
while window_sum >= s: # 不能用if 在滑动窗口的end不变的情况下,start单步往前走
min_len = min(min_len, window_end - window_start + 1)
window_sum -= arr[window_start]
window_start += 1
return 0 if min_len == math.inf else min_len
arr = [1, 1, 2, 2, 2, 2]
s = 4
print(smallest_subarray_with_given_sum(s, arr))
3、 滑动窗口3: 给定一个正数数组和一个正数S,找到其和大于或等于S的最小连续子数组的长度。如果不存在此类子数组,则返回0。
def lengthOfLongestSubstring(s):
if len(s) == 0:
return 0
if len(s) == 1:
return 1
from collections import defaultdict
window = defaultdict(int)
window_start = 0
window_end = 0
max_len = float("-inf")
while window_end < len(s):
a = s[window_end]
window_end += 1
window[a] += 1
while window[a] > 1:
b = s[window_start]
window[b] -= 1
window_start += 1
max_len = max(max_len, window_end-window_start)
return max_len
s = "abcabcbb"
print(lengthOfLongestSubstring(s))
二、排序
1、选择排序
- 动图演示:动图演示
# 选择排序法
def selection_sort(arr):
# 己算列表长度
n = len(arr)
for i in range(n - 1):
# 将起始元素设为最小元素
min_index = i
for j in range(i + 1, n):
if arr[j] < arr[min_index]:
min_index = j
arr[min_index], arr[i] = arr[i], arr[min_index]
return arr
arr = [26, 11, 99 , 33, 69, 77, 55, 56, 67]
print(selection_sort(arr))
2、插入排序
- 动图演示:动图演示