LeetCode题目总结——二维数组
文章目录
1. 配合Map
遍历数组,同时使用Map记录已遍历过的信息。
a. 常规问题可使用HashMap
b. 若索引为整数且范围较小,可使用数组代替HashMap
c. 若索引范围进一步缩小至32或64以内,且值为bool型,可使用一个整形数代替数组(整形数的各位代替数组元素)
- 0036 - 有效的数独
使用三个map分别记录行、列、块中出现过的数字。可使用整形数作为map。 - 0073 - 矩阵置零
2. 旋转遍历
旋转遍历数组,同时进行相应操作。注意维护好当前遍历层的起止行列号(m0, m1, n0, n1)。
- 0048 - 旋转图像
关键赋值公式:matrix(j, N-1-i)=matrix(i, j) 列号变行号,行号变列号同时被N-1减。 - 0054 - 螺旋矩阵
注意避免行列重复遍历,遍历逻辑:先遍历(m0, n0 ~ n1), (m0+1 ~ m1, n1), 如果n1>n0&&m1>m0,则再遍历(m1, n1-1 ~ n0+1), (m1 ~ m0+1, n0) - 0059 - 螺旋矩阵II
3. 元素查找
3.1 一维二分查找
将二维数组展开为一维数组,然后进行常规一维二分查找,需保证二维数组展开后仍满足单调性。
-
0074 - 搜索二维矩阵
将二维数组展开为一维数组,然后进行常规一维二分查找。 -
0300 - 最长递增子序列
int lengthOfLIS(vector<int>& nums) {
vector<int> ls;
for (int n : nums) {
if (ls.size() == 0 || ls.back() < n) {
ls.emplace_back(n);
}
else {
int l = 0;
int r = ls.size() - 1;
while (l < r) {
int m = l + (r - l) / 2;
if (ls[m] >= n) {
r = m;
}
else {
l = m + 1;
}
}
ls[l] = n;
}
}
return ls.size();
}
- 周赛222 - 3 - 得到子序列的最少操作次数
由于target数组不重复,因此可以将arr中的元素转为target中的索引,从而将最长公共子序列问题转换为最长递增子序列问题。
4. 二维动态规划
二维动态规划,注意可以按照逐行进行一维动态规划,从而将空间复杂度可以从O(n2)优化至O(n)的情况。
- 0062 - 不同路径