python从最长连续序列到正弦余弦曲线

11 阅读3分钟

在日常的编程学习中,我们既需要锻炼逻辑思维来解决算法问题,也需要掌握数据可视化的技能来直观展示信息。今天,我将分享两个有趣的编程练习:一个是经典的数组算法题 —— 寻找最长连续序列,另一个是使用 NumPy 和 Matplotlib 绘制数学函数图像。

一、算法挑战:寻找最长连续序列

问题描述

给定一个未排序的整数数组,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。例如,输入nums = [100,4,200,1,3,2,200],输出应为 4,因为最长连续序列是[1, 2, 3, 4]

解题思路

如果使用暴力解法,我们可能会先排序再遍历,但这样时间复杂度至少是 O (n log n)。更高效的方法是利用哈希集合来优化查找过程:

  1. 将数组元素存入集合,实现 O (1) 时间复杂度的查找
  2. 遍历集合中的每个数字,只有当该数字是序列起点(即num-1不在集合中)时,才开始向后查找连续数字
  3. 记录最长连续序列的长度

代码实现

def longest_consecutive(nums):
    num_set = set(nums)  # 转换为集合,用于快速查找
    max_length = 0       # 记录最长序列长度
    
    for num in num_set:
        # 只有当num是序列起点时才开始查找
        if num - 1 not in num_set:
            current_num = num
            current_length = 1
            
            # 向后查找连续数字
            while current_num + 1 in num_set:
                current_num += 1
                current_length += 1
            
            # 更新最大长度
            max_length = max(max_length, current_length)
    
    return max_length

# 测试示例
nums = [100, 4, 200, 1, 3, 2, 200]
print(f"最长连续序列长度: {longest_consecutive(nums)}")  # 输出:4

二、数据可视化:绘制正弦波与余弦波

需求分析

使用 NumPy 生成数据,结合 Matplotlib 绘制 0 到 2π 范围内的正弦和余弦曲线,并添加图例、坐标轴标签和标题。

实现步骤

  1. 使用 NumPy 生成等间隔的 x 轴数据
  2. 计算对应的正弦和余弦值
  3. 设置不同的线条样式和颜色
  4. 添加图表元素(图例、标签、标题)
  5. 显示图像

代码实现

import numpy as np
import matplotlib.pyplot as plt

# 生成x轴数据:从0到2π,步长0.1
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 = sin(x)')
# 绘制余弦曲线:红色虚线
plt.plot(x, y_cos, 'r--', label='y = cos(x)')

# 添加图例
plt.legend()
# 添加坐标轴标签
plt.xlabel('x')
plt.ylabel('y')
# 添加标题
plt.title('sin(x) and cos(x)')
# 显示网格
plt.grid(True, linestyle='--', alpha=0.7)

# 显示图像
plt.show()

总结与思考

通过这两个例子,我们可以看到:

  1. 算法优化:善用数据结构(如集合)可以显著提升算法效率,将 O (n log n) 的时间复杂度优化到 O (n)
  2. 可视化技巧:Matplotlib 提供了丰富的绘图功能,通过简单的 API 就能创建专业的图表
  3. 学习方法:结合算法练习和可视化实践,可以全面提升编程能力