题目描述:
个人理解:
首先能想到的就是,遍历所以的元素,判断该元素是不是行最小,列最大。或者可以对矩阵进行预处理,找出每一行最小的数,找出每一列最大的数,分别组成line[]数组,column[]数组,遍历两个数组寻找相等的数字,line[]的下标就是矩阵的行下标,column[]数组的下标就是矩阵的列下标。
源码:
/**
* ClassName:TestDemo
* Package:Work1380
* Description:
*给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。
*
* 幸运数是指矩阵中满足同时下列两个条件的元素:
*
* 在同一行的所有元素中最小
* 在同一列的所有元素中最大
*
*思路1:
* 遍历每一个元素,先判断当前数字是不是当前行最小的数,如果不是则isMin为false,并结束本次循环,接着查找下一个数
* 如果当前数字是当前行最小,再去判断此数字是不是当前列最大,如果不是最大则结束本次循环,如果是最大则放入list
*思路2:
* 先找出每一行最小的,设置为一个数组,line[]
* 再找出每一列最大的,设置为一个数组,column[]
* 遍历两个数组找到值相同的数字
* @date:2022/2/15 16:21
* @author:HDLaZy
*/
public class TestDemo {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入矩阵的大小");
int m=scanner.nextInt();
int n=scanner.nextInt();
int [][] matrix=new int[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
System.out.println("请输入第"+(i+1)+"行,第"+(j+1)+"个数据");
matrix[i][j]=scanner.nextInt();
}
}
Pojo p=new Pojo(matrix);
//List<Integer> list = p.luckyNumbers(matrix);
List<Integer> list = p.luckyNumbers2(matrix);
//System.out.println(list.get(0));
System.out.println(list.get(0));
}
}
class Pojo{
private int[][] matrix;
public Pojo(int[][] matrix) {
this.matrix = matrix;
}
public List<Integer> luckyNumbers (int[][] matrix) {
int m=matrix.length;
int n=matrix[0].length;
List list=new ArrayList();
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
boolean isMin=true;
boolean isMax=true;
for(int k=0;k<n;k++){
if(matrix[i][k]<matrix[i][j]){
isMin=false;
break;
}
}
if(!isMin){
continue;
}
for(int k=0;k<m;k++){
if(matrix[k][j]>matrix[i][j]){
isMax=false;
break;
}
}
if(isMax){
list.add(matrix[i][j]);
}
if(!list.isEmpty()){
break;
}
}
}
return list;
}
public List<Integer> luckyNumbers2 (int[][] matrix) {
List list=new ArrayList();
int [] line=new int[matrix.length];//行
int [] column=new int[matrix[0].length];//列
int min=Integer.MAX_VALUE;
int max=0;
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(min>matrix[i][j]){
min=matrix[i][j];
}
}
line[i]=min;
min=Integer.MAX_VALUE;
}
for(int i=0;i<matrix[0].length;i++){
for(int j=0;j<matrix.length;j++){
if(max<matrix[j][i]){
max=matrix[j][i];
}
}
column[i]=max;
max=0;
}
for(int i=0;i<line.length;i++){
for(int j=0;j<column.length;j++){
if(line[i]==column[j]){
list.add(line[i]);
break;
}
}
}
return list;
}
}