LeetCode1380

题目描述:

个人理解:

首先能想到的就是,遍历所以的元素,判断该元素是不是行最小,列最大。或者可以对矩阵进行预处理,找出每一行最小的数,找出每一列最大的数,分别组成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;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值