五月集训(第11天)— 矩阵
矩阵
1. 1351. 统计有序矩阵中的负数
思路:
大水题,直接遍历数组统计即可
int countNegatives(int** grid, int gridSize, int* gridColSize){
int ans = 0;
int r = gridSize, col = gridColSize[0];
for (int i = 0; i < r; i++) {
for (int j = 0; j < col; j++) {
if (grid[i][j] < 0) ans++;
}
}
return ans;
}
2. 1672. 最富有客户的资产总量
思路:
统计每一行的和,记录各行的最大值。
class Solution {
public:
int maximumWealth(vector<vector<int>>& accounts) {
int ans = 0, sum = 0;
int r = accounts.size(), col;
for (int i = 0; i < r; i++) {
col = accounts[i].size();
sum = 0;
for (int j = 0; j < col; j++) {
sum += accounts[i][j];
}
ans = max(ans, sum);
}
return ans;
}
};
3. 832. 翻转图像
思路:
水题,不多说。
class Solution {
public:
vector<vector<int>> flipAndInvertImage(vector<vector<int>>& image) {
int n = image[0].size();
int half_n = n / 2;
for (int i = 0; i < n; i++) {
for (int j = 0; j < half_n; j++) {
swap(image[i][j], image[i][n - 1 - j]);
image[i][j] = !image[i][j];
image[i][n - 1 - j] = !image[i][n - 1 - j];
}
if (n&1) image[i][half_n] = !image[i][half_n];
}
return image;
}
};
4. 1329. 将矩阵按对角线排序
思路:
利用每条主对角线i - j
的值相同的性质(副对角线i + j
相同)。取出每条对角线的值,排序后放回。
class Solution {
public:
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {
int r = mat.size();
int col = mat[0].size();
unordered_map<int, vector<int>> mmp;
for (int i = 0; i < r; i++) {
for (int j = 0; j < col; j++) {
mmp[i - j].emplace_back(mat[i][j]);
}
}
// 升序排列
for (auto &m : mmp) {
auto &vec = m.second;
sort(vec.begin(), vec.end(), greater<int>());
}
// 逆序取出(从后往前拿)
for (int i = 0; i < r; i++) {
for (int j = 0; j < col; j++) {
mat[i][j] = mmp[i - j].back();
mmp[i - j].pop_back();
}
}
return mat;
}
};
东方欲晓,莫道君行早。