刷题顺序是根据:有没有人一起从零开始刷力扣 - 力扣(LeetCode)
数组的定义:
数组是最简单的数据结构之一。数组,即元素的序列,可以按特定顺序存储元素。元素可以是整数,浮点数,字符,各种结构体等等。
我们可以选择以下两种方式创建数组,同理可得多维数组的创建方式。
dataType[] arrayRefVar = new dataType[arraySize];
dataType[] arrayRefVar = {value0, value1, ..., valuek};
当然解决数组问题也要掌握其他已有的工具,比如List、Map的创建:
Java中List的详细用法_Barcon的博客-CSDN博客_list用法
Java中Map详解_朱 江的博客-CSDN博客_mapjava
数组题目分类:
数组的遍历:
遍历数组过程中常用方法
//对数组nums进行排序
Arrays.sort(nums);
//对数组nums进行翻转
reverse(nums);
//数组nums的长度
nums.length
链接 |
---|
485. 最大连续1的个数 |
495. 提莫攻击 |
414. 第三大的数 |
628. 三个数的最大乘积 |
统计数组中的元素:
如何统计元素出现的次数?
元素个数的统计,若元素最大值与最小值之间相差不大(百万级别或以下),我们就可以用一个数组times[i]来表示i出现的次数,即times[nums[i]]++;
如何统计元素在数组中出现的最左和最右的位置?
我们可以参照元素出现次数的统计方法,用额外的数组l[i]和r[i]代表数字i出现的最左边和最右边的位置,在顺序遍历数组nums的第i个元素时,使r[nums[i]]=i,之后逆序遍历数组nums,使l[nums[i]]=i,可参考如下代码:
for (int i = 0; i < nums.size(); i++) {
r[nums[i]] = i;
}
for (int i = nums.size() - 1; i >= 0; i--) {
l[nums[i]] = i;
}
如何统计元素有没有出现,有没有重复出现?
可以根据上面统计元素出现的次数得知是否有重复出现,或者在原有的数组里面进行信息的丰富。我们可以想办法修改原数组,使得原数组包含每个数是否出现的信息。
例如每个数都是在[1,n]范围内的,那说明每个数都是正数,而且原数组和我们想用的cnt数组的长度时相同的,我们可以想办法修改原数组,使得原数组包含每个数是否出现的信息,比如在遍历至nums[i]时,使nums[nums[i]-1]变为负数,因为nums[i]原来是大于0的,所以在遍历完数组后,nums[i]小于0,说明i+1这个数出现过。
链接 |
---|
645. 错误的集合 |
697. 数组的度 |
448. 找到所有数组中消失的数字 |
442. 数组中重复的数据 |
41. 缺失的第一个正数 |
274. H 指数 |
数组的改变、移动:
数组的改变和移动主要体现在插入、删除、交换。
处理这一类题目首先要理清题意,并根据题目归路进行思路整理。
链接 |
---|
453. 最小移动次数使数组元素相等 |
665. 非递减数列 |
283. 移动零 |
二维数组思路整理:
二维数组通常要和图像进行结合,往往很多的解题是和图像挂钩的。我们要通过图像对二维数组元素之间的关系进行分析。
二维数组特定顺序解析:
int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; // 右下左上
二维数组结构储存:
在二维数组中,每个元素都是一个一维数组。有的时候,二维数组的某些元素并不是在整个运算过程中都要用到的。可能只需要用到前一个或前两个一维数组,此时,我们可以用到滚动数组。在滚动数组中,我们用若干个(k)一维数组保存原二维数组中的倒数k个一维数组,并在运算过程中更新这k个一维数组。
二维数组问题解决:
不论是根据图像或者是其他规律,最本质的数学表达式变化要找到,这是解决题目的根本,不管是数组的解决还是其他的算法题解决。
使用额外数组进行辅助解决问题:额外数组的目的是在不方便在原数组上面进行操作时储存信息,其信息的储存能帮助我们对解题思路的理解。
原地算法:二维数组的变换是数组篇中最难的一节,其难度在于如何尽量不用额外空间对二维数组中进行修改、旋转及统计。一般来说,原地算法要求我们在原有的空间(数组)内进行操作,不能额外地新建数组,这就需要我们对数组元素特点进行分析。
链接 |
---|
118. 杨辉三角 |
119. 杨辉三角 II |
661. 图片平滑器 |
598. 范围求和 II |
54. 螺旋矩阵 |
59. 螺旋矩阵 II |
498. 对角线遍历 |
566. 重塑矩阵 |
48. 旋转图像 |
73. 矩阵置零 |
289. 生命游戏 |
前缀和数组
在前缀和数组,第i位存放原数组中前i个元素的和。
前缀和数组有什么用?
前缀和数组一般可用于访问数组的部分和,即第数组中第i到第j个元素的和。有了前缀和数组sum以后,第i到第j个元素的和可以表示位前j个元素的和减前i-1个元素的和,即sum[j]-sum[i-1]。
链接 |
---|
303. 区域和检索 - 数组不可变 |
304. 二维区域和检索 - 矩阵不可变 |
238. 除自身以外数组的乘积 |