难度:简单
目录
一、问题描述
这里直接采用LeetCode上面的描述。
给你一个 m * n
的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。
幸运数是指矩阵中满足同时下列两个条件的元素:
- 在同一行的所有元素中最小
- 在同一列的所有元素中最大
下面给出示例:
提示:
- m == mat.length
- n == mat[i].length
- 1 <= n, m <= 50
- 1 <= matrix[i][j] <= 10^5
- 矩阵中的所有元素都是不同的
二、思路
1、解题思路
这里我采用的是 逐行扫描 ,每次扫描一行,求出行中 最小数字,返回该行最小数字和其下标。根据行最小数字下标,找到该列中最大的数字,如果满足:
- 在同一行的所有元素中最小
- 在同一列的所有元素中最大
那么,将该元素保存至容器中,直至扫描完所有行,直接返回答案即可。
三、解题
1、代码实现
class Solution {
public:
pair<int,int> minLine(vector<int>& nums,int length){
int min = 0x1f1f1f1f,index = 0;
for(int i = 0; i < length; i++){
if(nums[i] < min){
min = nums[i];
index = i;
}
}
return {min,index};
}
int maxRow(vector<vector<int>>& matrix,int rowLength,int rowNum){
int maxNum = 0;
for(int i = 0; i < rowLength; i++){
maxNum = max(maxNum,matrix[i][rowNum]);
}
return maxNum;
}
vector<int> luckyNumbers (vector<vector<int>>& matrix) {
//保存行元素大小、以及列元素大小
int lineLength = matrix[0].size(), rowLength = matrix.size();
vector<int> ans;
for(auto& it : matrix){
//扫描一行,得到行最小数字及其下标
auto lineMinIndex = minLine(it,lineLength);
//根据行最小数字下标,得到列号,扫描该列 求出该列最大元素
int rowMax = maxRow(matrix, rowLength, lineMinIndex.second);
//对比 该行最小数字 是否是 所在列最大数字
if(lineMinIndex.first == rowMax){
ans.push_back(rowMax);
}
}
return ans;
}
};
2、时间复杂度 and 空间复杂度
时间复杂度:,m 与 n 分别为 行列数字个数
空间复杂度: