常见算法题Python

一、滑动窗口类

  • 解题思路
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、插入排序


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值