Skip to content

yoinspiration/dsa

Repository files navigation

🚀 DSA 数据结构与算法学习项目

专注于 LeetCode 经典题目的多种解法实现和深度对比分析

License: MIT Language: C Platform: Cross-platform

📋 项目概述

这是一个专注于数据结构与算法学习的开源项目,通过实现 LeetCode 经典题目的多种解法,帮助学习者深入理解算法设计思想和性能优化技巧。

🎯 项目特色

  • 多解法对比:每种题目提供多种经典解法实现
  • 性能分析:详细的时间复杂度和空间复杂度分析
  • 代码规范:遵循 C99 标准,代码清晰易读
  • 深度文档:包含算法思路、实现细节和选择指南
  • 学习路径:从基础到高级的渐进式学习

📁 项目结构

dsa/
├── README.md                           # 项目说明文档
├── LICENSE                             # MIT 开源协议
├── .cursorrules                        # 项目开发规范
├── .gitignore                          # Git 忽略文件
├── two_sum/                            # Two Sum 问题
│   ├── two_sum_brute_force.c           # 暴力解法实现
│   ├── two_sum_sort_two_pointers.c     # 排序+双指针解法
│   ├── two_sum_hash_table.c            # 哈希表解法(推荐)
│   └── two_sum_complete_analysis.md    # 完整分析文档
└── move_zeroes/                        # Move Zeroes 问题
    ├── move_zeroes_brute_force.c       # 暴力解法(逐个移动法)
    ├── move_zeroes_two_pointers.c      # 快慢指针法
    ├── move_zeroes_optimal.c           # 最优解法(覆盖法)
    └── move_zeroes_complete_analysis.md # 完整分析文档

🚀 快速开始

环境要求

  • 编译器:支持 C99 标准的编译器(如 GCC、Clang)
  • 操作系统:Windows、Linux、macOS
  • 内存:至少 4MB 可用内存

编译运行

# 编译 Two Sum 暴力解法
gcc -o two_sum_brute two_sum/two_sum_brute_force.c
./two_sum_brute

# 编译 Two Sum 排序+双指针解法
gcc -o two_sum_sort two_sum/two_sum_sort_two_pointers.c
./two_sum_sort

# 编译 Two Sum 哈希表解法(推荐)
gcc -o two_sum_hash two_sum/two_sum_hash_table.c
./two_sum_hash

# 编译 Move Zeroes 暴力解法
gcc -o move_zeroes_brute move_zeroes/move_zeroes_brute_force.c
./move_zeroes_brute

# 编译 Move Zeroes 快慢指针法
gcc -o move_zeroes_two_pointers move_zeroes/move_zeroes_two_pointers.c
./move_zeroes_two_pointers

# 编译 Move Zeroes 最优解法(推荐)
gcc -o move_zeroes_optimal move_zeroes/move_zeroes_optimal.c
./move_zeroes_optimal

测试用例

Two Sum 测试用例

// 示例输入
int nums[] = {2, 7, 11, 15};
int target = 9;
int numsSize = 4;

// 期望输出
// [0, 1] 因为 nums[0] + nums[1] = 2 + 7 = 9

Move Zeroes 测试用例

// 示例输入
int nums[] = {0, 1, 0, 3, 12};
int numsSize = 5;

// 期望输出
// [1, 3, 12, 0, 0] 所有0移动到末尾,保持非零元素相对顺序

📚 已实现题目

🔥 Two Sum (LeetCode 1)

问题描述:给定整数数组和目标值,返回两个数的索引使它们的和等于目标值。

解法对比

解法 时间复杂度 空间复杂度 推荐指数 适用场景
暴力法 O(n²) O(1) ⭐⭐⭐ 小数据量,简单需求
排序+双指针 O(n log n) O(n) ⭐⭐⭐⭐ 中等数据量,平衡需求
哈希表法 O(n) O(n) ⭐⭐⭐⭐⭐ 大数据量,性能优先

性能测试结果

数据规模 暴力法(ms) 排序法(ms) 哈希表法(ms) 性能提升
100 0.1 0.05 0.02 5倍
1,000 10 0.5 0.2 50倍
10,000 1,000 5 2 500倍
100,000 100,000 50 20 5,000倍

💡 推荐:哈希表法是最优解,时间复杂度 O(n),适合大多数实际应用场景。

🔥 Move Zeroes (LeetCode 283)

问题描述:给定整数数组,将所有 0 移动到数组末尾,同时保持非零元素的相对顺序。

解法对比

解法 时间复杂度 空间复杂度 推荐指数 适用场景
暴力法 O(n²) O(1) ⭐⭐ 小数据量,理解算法思路
快慢指针法 O(n) O(1) ⭐⭐⭐⭐ 中等数据量,平衡性能与复杂度
覆盖法 O(n) O(1) ⭐⭐⭐⭐⭐ 大数据量,操作次数最少

算法特点

  • 暴力法:逐个移动法,从后往前遍历避免重复处理
  • 快慢指针法:两次遍历,先收集非零元素再填充零
  • 覆盖法:一次遍历,最小化操作次数,符合 LeetCode follow-up 要求

性能测试结果

数据规模 暴力法(ms) 快慢指针法(ms) 覆盖法(ms) 性能提升
100 0.5 0.02 0.01 50倍
1,000 50 0.2 0.1 500倍
10,000 5,000 2 1 5,000倍
100,000 500,000 20 10 50,000倍

💡 推荐:覆盖法是最优解,时间复杂度 O(n),操作次数最少,适合所有实际应用场景。

🛠️ 开发规范

代码风格

  • 语言标准:遵循 C99 标准
  • 命名规范:使用小写字母和下划线
  • 注释规范:详细说明算法思路和实现细节
  • 内存管理:及时释放 malloc 分配的内存

文件命名

  • C 文件problem_name_solution_type.c
  • 文档文件problem_name_complete_analysis.md
  • 示例two_sum_hash_table.c

Git 提交规范

类型: 简短描述

feat: 添加 Two Sum 哈希表解法实现
docs: 更新算法性能对比分析
fix: 修复内存泄漏问题
refactor: 优化哈希函数实现

📖 学习指南

学习路径

  1. 入门阶段:掌握暴力法,理解问题本质
  2. 进阶阶段:学习排序法/快慢指针法,掌握优化思路
  3. 高级阶段:实现哈希表法/覆盖法,追求最优解

面试准备

  • 初级面试:展示暴力法 → 优化过程
  • 中级面试:重点讲解优化算法实现细节
  • 高级面试:直接展示最优解
  • 算法讨论:对比多种解法,展示完整思维过程

生产环境选择

Two Sum 场景

  • 小数据量(< 1000):选择暴力法(简单可靠)
  • 中等数据量(1000-10000):选择排序法(平衡性能与复杂度)
  • 大数据量(> 10000):选择哈希表法(最优性能)

Move Zeroes 场景

  • 小数据量(< 1000):选择暴力法(理解算法思路)
  • 中等数据量(1000-10000):选择快慢指针法(平衡性能与复杂度)
  • 大数据量(> 10000):选择覆盖法(最优性能,操作次数最少)

🤝 贡献指南

如何贡献

  1. Fork 本仓库
  2. 创建 功能分支:git checkout -b feature/new-algorithm
  3. 提交 更改:git commit -m 'feat: 添加新算法实现'
  4. 推送 分支:git push origin feature/new-algorithm
  5. 创建 Pull Request

贡献内容

  • ✅ 新算法题目实现
  • ✅ 性能测试和优化
  • ✅ 文档完善和更新
  • ✅ Bug 修复和改进
  • ✅ 代码规范优化

代码审查

  • 确保代码符合 C99 标准
  • 添加详细的注释说明
  • 包含完整的错误处理
  • 提供性能测试结果

📄 开源协议

本项目采用 MIT License 开源协议。

协议要点

  • ✅ 允许商业使用
  • ✅ 允许修改和分发
  • ✅ 允许私人使用
  • ✅ 只需保留版权声明

📞 联系方式

🙏 致谢

感谢所有为这个项目做出贡献的开发者和学习者!

特别感谢

  • LeetCode 平台提供的优质算法题目
  • 开源社区的技术分享和讨论
  • 所有使用和反馈的用户

📈 项目统计

GitHub stars GitHub forks GitHub issues GitHub pull requests


⭐ 如果这个项目对您有帮助,请给个 Star 支持一下!

Made with ❤️ by yoinspiration

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages