int M = nums.length; // 获取原始矩阵的行数
int N = nums[0].length; // 假设原始矩阵不是空矩阵,获取其列数
if (M * N != r * c) { // 检查维度兼容性
return nums; // 如果维度不兼容,返回原始矩阵
}
int[][] res = new int[r][c]; // 创建一个新的二维数组,大小为r x c,用于存储重塑后的矩阵
int row = 0, col = 0; // 初始化目标矩阵的填充位置索引
for (int i = 0; i < M; i++) { // 外层循环遍历原始矩阵的行
for (int j = 0; j < N; j++) { // 内层循环遍历列
if (col == c) { // 如果已经填满了一行
row += 1; // 移到下一行
col = 0; // 重置列索引
}
res[row][col] = nums[i][j]; // 将原始矩阵的元素填充到目标矩阵的对应位置
col += 1; // 移到下一列
}
}
return res; // 返回重塑后的矩阵
2.区间加法
题目:
给你一个 m x n 的矩阵 M和一个操作数组 op 。矩阵初始化时所有的单元格都为 0 。ops[i] = [ai, bi] 意味着当所有的 0 <= x < ai 和 0 <= y < bi 时, M[x][y] 应该加 1。
在 执行完所有操作后 ,计算并返回 矩阵中最大整数的个数 。
示例 :
复制代码
输入: m = 3, n = 3,ops = [[2,2],[3,3]]
输出: 4
解释: M 中最大的整数是 2, 而且 M 中有4个值为2的元素。因此返回 4。
这个问题实际上并不需要真正去模拟矩阵的加法操作或者构建一个真实的矩阵。关键在于理解操作数组 ops 对矩阵 M 的影响。每个操作 [ai, bi] 实际上是在说:"在矩阵的左上角 ai x bi 的子矩阵内的所有元素都应该加 1"。但是,由于所有元素初始都是 0,并且每个操作都是对整个子矩阵的加 1 操作,因此最终矩阵 M 的最大值将仅由操作数组 ops 中定义的最小 ai 和最小 bi 决定。
代码(Java)
java复制代码
class Solution {
public int maxCount(int m, int n, int[][] ops) {
// 遍历操作数组
for (int[] op : ops) {
// 更新 m 为当前 m 和操作数组中的 ai 的最小值
m = Math.min(m, op[0]);
// 更新 n 为当前 n 和操作数组中的 bi 的最小值
n = Math.min(n, op[1]);
}
// 返回最终矩阵中最大整数的个数,即 m * n
return m * n;
}
}
假设我们有以下输入:
矩阵的初始大小(虽然在这个问题中实际上并不重要,因为我们只关心操作数组):m = 5, n = 5(即一个 5x5 的矩阵,但所有元素初始都是 0)。
操作数组 ops:[[2, 3], [4, 2], [1, 5]]。
现在,我们逐步执行代码:
初始化:
m = 5
n = 5
ops = [[2, 3], [4, 2], [1, 5]]
开始遍历操作数组:
第一步(处理第一个操作 [2, 3]):
m = Math.min(5, 2); -> m = 2(因为 2 是当前 m 和 op[0] 的最小值)。
n = Math.min(5, 3); -> n = 3(因为 3 是当前 n 和 op[1] 的最小值)。
此时:
m = 2
n = 3
第二步(处理第二个操作 [4, 2]):
m = Math.min(2, 4); -> m = 2(因为 2 仍然是当前 m 和 op[0] 的最小值)。
n = Math.min(3, 2); -> n = 2(因为 2 是当前 n 和 op[1] 的最小值)。
此时:
m = 2
n = 2
第三步(处理第三个操作 [1, 5]):
m = Math.min(2, 1); -> m = 1(因为 1 是当前 m 和 op[0] 的最小值)。
n = Math.min(2, 5); -> n = 2(因为 2 仍然是当前 n 和 op[1] 的最小值)。
class Solution {
public int[] findErrorNums(int[] nums) {
int n = nums.length;
int[] cnts = new int[n + 1];
for (int x : nums) cnts[x]++;
int[] ans = new int[2];
for (int i = 1; i <= n; i++) {
if (cnts[i] == 0) ans[1] = i;
if (cnts[i] == 2) ans[0] = i;
}
return ans;
}
}