Python算法实战:从滑动窗口到数学可视化

导入

在编程学习和算法实践中,我们经常会遇到一些经典问题,它们不仅考察我们对数据结构的理解,还考验我们解决问题的思维模式。今天我们将通过四个不同领域的Python实战题目,从字符串处理到数组操作,再到数据可视化,全面展示Python在实际问题中的应用。

题目一:无重复字符的最长子串

给定一个字符串 s ,请找出其中不含有重复字符的最长子串的长度。

代码

python 复制代码
def longest_subString(s):
    char_set = set() # 存放当前窗口内的字符,初始化为空
    left = 0 # 滑动窗口的左边界
    max_len = 0 # 记录最大长度

    for right in range(len(s)): # 右边界遍历字符串s
        while s[right] in char_set: # 若当前字符在窗口中,收缩左边界直到字符移除
            char_set.remove(s[left])
            left += 1
        # 将当前字符添加到窗口中
        char_set.add(s[right])
        # 更新最大长度
        max_len = max(max_len, right - left + 1)
    return max_len

# 测试用例
s = "abcabcbb"
print(longest_subString(s))

代码结果

代码分析

  1. 滑动窗口算法:使用双指针(left和right)维护一个滑动窗口,保证窗口内字符不重复
  2. 集合去重:利用Python的set自动去重特性,快速判断字符是否重复
  3. 窗口收缩:当遇到重复字符时,从左边界开始收缩窗口,直到移除重复字符
  4. 时间复杂度:O(n),每个字符最多被访问两次(右指针一次,左指针一次)
  5. 空间复杂度:O(min(m,n)),其中m是字符集大小,n是字符串长度

题目二:三数之和

给定一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请返回所有和为 0 且不重复的三元组。

代码

python 复制代码
def three_num(nums):
    res = set() # 存放结果,集合
    n = len(nums)
    for i in range(n): # 第一个元素
        for j in range(i + 1, n): # 第二个元素
            for k in range(j + 1, n): # 第三个元素
                if nums[i] + nums[j] + nums[k] == 0:
                    tmp = tuple(sorted([nums[i], nums[j], nums[k]]))
                    res.add(tmp) # 集合内部自动去重
    return res

nums = [-1,0,1,2,-1,-4]
print(three_num(nums))

代码结果

代码分析

  1. 暴力枚举:使用三重循环枚举所有可能的三元组组合
  2. 自动去重:通过将三元组转换为排序后的元组,利用set自动去重特性
  3. 结果存储:使用set存储结果,避免重复三元组的出现
  4. 时间复杂度:O(n³),对于大规模数据效率较低,但代码简单易懂
  5. 改进空间:可以使用排序+双指针的方法优化到O(n²)时间复杂度

题目三:最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

代码

python 复制代码
def longest_subNums(nums):
    num_set = set(nums) # 存放数组,作为一个参考基准
    max_len = 0 # 记录最大长度
    for num in num_set:
        if num - 1 not in num_set: # 如果num-1不在集合中
            current_num = num # 记录当前数字
            current_len = 1 # 记录当前长度
            # 往后遍历连续的数字
            while current_num + 1 in num_set:
                current_num += 1
                current_len += 1
            # 更新最大长度
            max_len = max(max_len, current_len)
    return max_len

nums = [100,4,200,1,3,2,200]
print(longest_subNums(nums))

代码结果

代码分析

  1. 集合优化查找:将数组转换为set,实现O(1)时间复杂度的查找
  2. 序列起点判断:只有当num-1不在集合中时,才将num作为序列起点,避免重复计算
  3. 连续序列扩展:从起点开始向后扩展,统计连续序列的长度
  4. 时间复杂度:O(n),每个数字最多被访问两次(作为起点和作为中间元素)
  5. 算法巧妙性:通过判断num-1是否存在,确保每个连续序列只被计算一次

题目四:正弦波和余弦波的可视化

使用 NumPy 和 Matplotlib 绘制一个正弦波和余弦波的图像,要求横坐标为 0 到 2π,每隔 0.1 取一个点,图像中正弦波为蓝色实线,余弦波为红色虚线,并且添加图例、x 轴标签为 'x',y 轴标签为 'y',标题为 'sinx and cosx'。

代码

python 复制代码
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 2 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)

plt.plot(x, y_sin, 'b-', label="y=sinx")
plt.plot(x, y_cos, "r--", label='y=cosx')
plt.legend()
plt.show()

代码结果

代码分析

  1. 数值计算:使用numpy.arange生成等间距的x坐标点,步长为0.1
  2. 数学函数:利用numpy的sin和cos函数计算对应的y值
  3. 图形绘制
    • 正弦波:蓝色实线('b-')
    • 余弦波:红色虚线('r--')
  4. 图表美化
    • 添加图例说明每条曲线代表的函数
    • 自动生成坐标轴标签和标题
  5. 可视化效果:清晰展示正弦和余弦函数的周期性特征和相位关系

总结

通过这四个实战题目,我们深入了解了Python在不同场景下的应用:

算法思维提升

  1. 滑动窗口:适用于子串、子数组类问题,通过动态维护窗口来优化性能
  2. 集合去重:利用数据结构的特性简化代码逻辑,提高效率
  3. 数学可视化:将抽象数学概念转化为直观图形,加深理解
相关推荐
GIS之路31 分钟前
GDAL 实现矢量裁剪
前端·python·信息可视化
IT=>小脑虎38 分钟前
Python零基础衔接进阶知识点【详解版】
开发语言·人工智能·python
智航GIS40 分钟前
10.6 Scrapy:Python 网页爬取框架
python·scrapy·信息可视化
清水白石0081 小时前
解构异步编程的两种哲学:从 asyncio 到 Trio,理解 Nursery 的魔力
运维·服务器·数据库·python
山海青风1 小时前
图像识别零基础实战入门 1 计算机如何“看”一张图片
图像处理·python
彼岸花开了吗2 小时前
构建AI智能体:八十、SVD知识整理与降维:从数据混沌到语义秩序的智能转换
人工智能·python·llm
山土成旧客2 小时前
【Python学习打卡-Day40】从“能跑就行”到“工程标准”:PyTorch训练与测试的规范化写法
pytorch·python·学习
闲人编程2 小时前
消息通知系统实现:构建高可用、可扩展的企业级通知服务
java·服务器·网络·python·消息队列·异步处理·分发器
大神君Bob2 小时前
【AI办公自动化】如何使用Pytho让Excel表格处理自动化
python
Heorine2 小时前
数学建模 绘图 图表 可视化(6)
python·数学建模·数据可视化