题目来源
题目详情
题目解析
预处理出两个数组rMin和cMax,其中
- rMin[i]表示第i行中最小的元素
- cMax[j]表示第j列中最大的元素
接着遍历矩阵maxtrix,判断每个 m a t r i x [ i ] [ j ] matrix[i][j] matrix[i][j]是否是这一行最小的并且是这一列中最大的
思考:rMin 和 cMax 是否可以存放「行最小值」和「列最大值」的索引? 答案是可以。但是如果原题中没有说明「矩阵中的数字 各不相同」就不能这么干。
vector<int> luckyNumbers (vector<vector<int>>& matrix) {
vector<int> row(matrix.size(), INT_MAX); //最小
vector<int> line(matrix[0].size(), INT_MIN); //最大
for (int i = 0; i < matrix.size(); ++i) {
for (int j = 0; j < matrix[i].size(); ++j) {
row[i] = min(matrix[i][j], row[i]);
line[j] = max(matrix[i][j], line[j]);
}
}
vector<int> res;
for (int i = 0; i < matrix.size(); ++i) {
for (int j = 0; j < matrix[i].size(); ++j) {
if(matrix[i][j] == row[i] && matrix[i][j] == line[j]){
res.push_back(matrix[i][j]);
}
}
}
return res;
}
List<Integer> list = new ArrayList<>();
for (int i = 0; i < matrix.length; i++){
// 假设每行的第一个元素最小
int min = matrix[i][0];
int minindex = 0;
// 找出i行中最小的那个数
// 数组是无序,而且各不相同的
for (int j = 1; j < matrix[i].length / 2 + 1; j++){
if (matrix[i][j] < min){
minindex = j;
min = matrix[i][j];
}
if (matrix[i][matrix[i].length - j] < min){
minindex = matrix[i].length - j;
min = matrix[i][matrix[i].length - j];
}
}
// 判断这个元素是不是该行的最大元素
int m = minindex;
boolean flag = true;
for (int j = 0; j < matrix.length; j++){
if (min < matrix[j][m]){ // 有比他大
flag = false;
break;
}
}
if (flag){
list.add(min);
}
}
return list;