开源地址
为了便于大家学习,所有实现均已开源。欢迎 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 | 有序数组的平方 | 双指针 |
六、总结
普通数组虽然简单,但它是:
- 所有线性结构的基础
- 几乎所有算法入门的起点
- 力扣中最频繁使用的数据结构之一
很多题目看似是“高级技巧”,本质上都围绕数组做文章。学透数组,就等于打开了算法题的大门。
小结
希望本文对你有帮助,如果有其他想法的话,也可以评论区和大家分享哦。
各位极客的点赞收藏转发,是老马持续写作的最大动力!
感兴趣的小伙伴可以关注一波,精彩内容,不容错过。