开源地址

为了便于大家学习,所有实现均已开源。欢迎 fork + star~

https://github.com/houbb/leetcode

数组

在力扣(LeetCode)中,“普通数组”是最基础也是最常见的数据结构之一。虽然“普通数组”这个说法听起来很简单,但它在算法题中扮演着非常重要的角色,很多高级技巧(如前缀和、差分、滑动窗口等)也是在数组的基础上发展出来的。


一、什么是普通数组?

在编程中,“数组”(Array)是一种线性数据结构,用于按照顺序存储一组相同类型的元素。

在 Java 中:

int[] nums = new int[]{1, 2, 3, 4};

在 Python 中:

nums = [1, 2, 3, 4]

二、数组的特点

特性 描述
连续内存 数组中的元素在内存中是连续存储的,支持通过下标快速访问(O(1) 时间复杂度)。
支持随机访问 可以通过下标 nums[i] 快速访问或修改元素。
固定大小 大多数语言中数组的大小一旦定义就不能更改(例如 Java),除非重新创建。

三、力扣中数组的常见操作

  1. 遍历数组

    for (int i = 0; i < nums.length; i++) {
        // 访问 nums[i]
    }
    
  2. 查找最大/最小值

    int max = Integer.MIN_VALUE;
    for (int num : nums) {
        max = Math.max(max, num);
    }
    
  3. 求和

    int sum = 0;
    for (int num : nums) {
        sum += num;
    }
    
  4. 排序

    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 有序数组的平方 双指针

六、总结

普通数组虽然简单,但它是:

  • 所有线性结构的基础
  • 几乎所有算法入门的起点
  • 力扣中最频繁使用的数据结构之一

很多题目看似是“高级技巧”,本质上都围绕数组做文章。学透数组,就等于打开了算法题的大门。

小结

希望本文对你有帮助,如果有其他想法的话,也可以评论区和大家分享哦。

各位极客的点赞收藏转发,是老马持续写作的最大动力!

感兴趣的小伙伴可以关注一波,精彩内容,不容错过。

参考资料