2023-07-04每日一题
一、题目编号
2679. 矩阵中的和
二、题目链接
三、题目描述
给你一个下标从 0 开始的二维整数数组 nums 。一开始你的分数为 0 。你需要执行以下操作直到矩阵变为空:
- 矩阵中每一行选取最大的一个数,并删除它。如果一行中有多个最大的数,选择任意一个并删除。
- 在步骤 1 删除的所有数字中找到最大的一个数字,将它添加到你的 分数 中。
请你返回最后的 分数 。
提示:
- 1 <= nums.length <= 300
- 1 <= nums[i].length <= 500
- 0 <= nums[i][j] <= 103
四、解题代码
class Solution {
public:
int matrixSum(vector<vector<int>>& nums) {
int m = nums.size();
int n = nums[0].size();
int sum = 0;
for(int i = 0; i < m; ++i){
sort(nums[i].begin(), nums[i].end(), greater<int>());
}
for(int j = 0; j < n; ++j){
int max0 = -1;
for(int i = 0; i < m; ++i){
max0 = max(max0, nums[i][j]);
}
sum += max0;
}
return sum;
}
};
class Solution:
def matrixSum(self, nums: List[List[int]]) -> int:
res = 0
m = len(nums)
n = len(nums[0])
for i in range(m):
nums[i].sort()
for j in range(n):
max_val = 0
for i in range(m):
max_val = max(max_val, nums[i][j])
res += max_val
return res
五、解题思路
(1) 首先题目里面的要求是,<1> 找出每一行的最大值,然后将最大值删除。<2> 在这些删除的数字中找出一个最大的数字。
(2) 我们记nums.size() 等于m,nums[0].size() 等于 n。那么我们首先需要做的是,就是利用cpp中自带的sort函数,来将矩阵的每一行从大到小来进行排序。
(3) 那么我们思考一下,每一次找出的最大值,都在一列上。那是因为经过排序后,数字已经变成从大到小排序了。
(4) 那我们从左到右遍历这n列,这n列就分别对应我们要删除n次的对应的数字。紧接着,我们用线性枚举的方式,找出这每一列中最大的数字,那么每一列中这个最大的数字,就加入到我们结果的总分之中即可。