在日常的编程学习中,我们既需要锻炼逻辑思维来解决算法问题,也需要掌握数据可视化的技能来直观展示信息。今天,我将分享两个有趣的编程练习:一个是经典的数组算法题 —— 寻找最长连续序列,另一个是使用 NumPy 和 Matplotlib 绘制数学函数图像。
一、算法挑战:寻找最长连续序列
问题描述
给定一个未排序的整数数组,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。例如,输入nums = [100,4,200,1,3,2,200],输出应为 4,因为最长连续序列是[1, 2, 3, 4]。
解题思路
如果使用暴力解法,我们可能会先排序再遍历,但这样时间复杂度至少是 O (n log n)。更高效的方法是利用哈希集合来优化查找过程:
- 将数组元素存入集合,实现 O (1) 时间复杂度的查找
- 遍历集合中的每个数字,只有当该数字是序列起点(即
num-1不在集合中)时,才开始向后查找连续数字 - 记录最长连续序列的长度
代码实现
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π 范围内的正弦和余弦曲线,并添加图例、坐标轴标签和标题。
实现步骤
- 使用 NumPy 生成等间隔的 x 轴数据
- 计算对应的正弦和余弦值
- 设置不同的线条样式和颜色
- 添加图表元素(图例、标签、标题)
- 显示图像
代码实现
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()
总结与思考
通过这两个例子,我们可以看到:
- 算法优化:善用数据结构(如集合)可以显著提升算法效率,将 O (n log n) 的时间复杂度优化到 O (n)
- 可视化技巧:Matplotlib 提供了丰富的绘图功能,通过简单的 API 就能创建专业的图表
- 学习方法:结合算法练习和可视化实践,可以全面提升编程能力