开源地址
为了便于大家学习,所有实现均已开源。欢迎 fork + star~
数组
在力扣(LeetCode)中,“普通数组”是最基础也是最常见的数据结构之一。虽然“普通数组”这个说法听起来很简单,但它在算法题中扮演着非常重要的角色,很多高级技巧(如前缀和、差分、滑动窗口等)也是在数组的基础上发展出来的。
一、什么是普通数组?
在编程中,“数组”(Array)是一种线性数据结构,用于按照顺序存储一组相同类型的元素。
在 Java 中:
int[] nums = new int[]{1, 2, 3, 4};
在 Python 中:
nums = [1, 2, 3, 4]
二、数组的特点
| 特性 | 描述 |
|---|---|
| 连续内存 | 数组中的元素在内存中是连续存储的,支持通过下标快速访问(O(1) 时间复杂度)。 |
| 支持随机访问 | 可以通过下标 nums[i] 快速访问或修改元素。 |
| 固定大小 | 大多数语言中数组的大小一旦定义就不能更改(例如 Java),除非重新创建。 |
三、力扣中数组的常见操作
-
遍历数组
for (int i = 0; i < nums.length; i++) { // 访问 nums[i] } -
查找最大/最小值
int max = Integer.MIN_VALUE; for (int num : nums) { max = Math.max(max, num); } -
求和
int sum = 0; for (int num : nums) { sum += num; } -
排序
Arrays.sort(nums);
四、常见题型分类
| 题型 | 说明 |
|---|---|
| 前缀和 | 快速计算某一段区间的和(如:LC 560, LC 303) |
| 滑动窗口 | 高效处理连续区间问题(如:LC 209, LC 239) |
| 双指针 | 常用于有序数组查找问题(如:LC 167, LC 26) |
| 差分数组 | 用于处理区间频繁更新问题(如:LC 370) |
| 排序 + 二分 / 去重 | 排序后进行二分、哈希、指针去重(如:LC 1, LC 15) |
| 动态规划状态数组 | DP 本质上也常用数组保存状态(如:LC 198, LC 70) |
| 计数 / 桶排序思想 | 如:LC 169, LC 75, LC 451 |
五、力扣数组典型题目推荐
| 题号 | 标题 | 类型 |
|---|---|---|
| 1 | 两数之和 | 哈希+数组 |
| 26 | 删除有序数组中的重复项 | 双指针 |
| 27 | 移除元素 | 双指针 |
| 53 | 最大子数组和 | 动态规划(Kadane 算法) |
| 238 | 除自身以外数组的乘积 | 前缀积 + 后缀积 |
| 283 | 移动零 | 双指针 |
| 560 | 和为 K 的子数组 | 前缀和 + 哈希 |
| 704 | 二分查找 | 数组 + 二分 |
| 977 | 有序数组的平方 | 双指针 |
六、总结
普通数组虽然简单,但它是:
- 所有线性结构的基础
- 几乎所有算法入门的起点
- 力扣中最频繁使用的数据结构之一
很多题目看似是“高级技巧”,本质上都围绕数组做文章。学透数组,就等于打开了算法题的大门。
小结
希望本文对你有帮助,如果有其他想法的话,也可以评论区和大家分享哦。
各位极客的点赞收藏转发,是老马持续写作的最大动力!
感兴趣的小伙伴可以关注一波,精彩内容,不容错过。
