1. 题目
题目链接:删除每行中的最大值
给你一个 m x n 大小的矩阵 grid ,由若干正整数组成。
执行下述操作,直到 grid 变为空矩阵:
从每一行删除值最大的元素。如果存在多个这样的值,删除其中任何一个。
将删除元素中的最大值与答案相加。
注意 每执行一次操作,矩阵中列的数据就会减 1 。
返回执行上述操作后的答案。
-
示例 1:
输入:grid = [[1,2,4],[3,3,1]]
输出:8
解释:上图展示在每一步中需要移除的值。
在第一步操作中,从第一行删除 4 ,从第二行删除 3(注意,有两个单元格中的值为 3 ,我们可以删除任一一个)。在答案上加 4 。
在第二步操作中,从第一行删除 2 ,从第二行删除 3 。在答案上加 3 。
在第三步操作中,从第一行删除 1 ,从第二行删除 1 。在答案上加 1 。
最终,答案 = 4 + 3 + 1 = 8 。 -
示例 2:
输入:grid = [[10]]
输出:10
解释:上图展示在每一步中需要移除的值。
在第一步操作中,从第一行删除 10 。在答案上加 10 。
最终,答案 = 10 。
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 50
1 <= grid[i][j] <= 100
2. 解题思路
将给出的数组按每一行排序,排好序后,从前往后(或者从后往前)依次取最后一列上最大的那个数max,让sum+=max,最后返回就行啦~
- 首先使用循环遍历二维数组的每一行,对每行的元素进行排序,确保每行的元素按升序排列。
- 接着通过比较每行的最后一个元素,找出每行的最大值,并将每行的最大值累加到变量 sum 中。
- 最后函数返回 sum,此时sum就代表了删除了每行最大值后的累加和结果。
3. 代码
//实现比较函数
int cmp(const void *p1,const void *p2) {
return *(int*)p1 - *(int*)p2;
}
int deleteGreatestValue(int** grid, int gridSize, int* gridColSize) {
int sum = 0;//存放答案
//用循环对每行排序
for(int i=0;i<gridSize;i++) {
qsort(grid[i],*gridColSize,sizeof(int),cmp);
}
//比较每行的最后一个元素
int col = *gridColSize-1;
while(col>=0) {
int max = grid[0][col];
for(int i= 1;i<gridSize;i++) {
if(max<grid[i][col]) {
max = grid[i][col];
}
}
sum+=max;
--col;
}
return sum;
}