从零学算法2033

2033.对一个大小为 n x n 的矩阵而言,如果其每一行和每一列都包含从 1 到 n 的 全部 整数(含 1 和 n),则认为该矩阵是一个 有效 矩阵。
给你一个大小为 n x n 的整数矩阵 matrix ,请你判断矩阵是否为一个有效矩阵:如果是,返回 true ;否则,返回 false 。
示例 1:
输入:matrix = [[1,2,3],[3,1,2],[2,3,1]]
输出:true
解释:在此例中,n = 3 ,每一行和每一列都包含数字 1、2、3 。
因此,返回 true 。
示例 2:
输入:matrix = [[1,1,1],[1,2,3],[1,2,3]]
输出:false
解释:在此例中,n = 3 ,但第一行和第一列不包含数字 2 和 3 。
因此,返回 false 。

  • 我的原始人解法:先创建一个数组,拿到每一行和每一列,遍历这个数组,将行列的值顺序排序,判断是否每一个值都比前一个大 1 即可。
  •   public boolean checkValid(int[][] matrix) {
          int n = matrix.length;
          int[][] mat = new int[2*n][n];
          // 取每一行每一列成一个数组
          for(int i=0;i<n;i++){
              mat[i] = matrix[i];
              for(int j=0;j<n;j++){
                  mat[n+i][j] = matrix[j][i];
              }
          }
          for(int i=0;i<2*n;i++){
              Arrays.sort(mat[i]);
              for(int j=1;j<n;j++){
                  if(mat[i][j]-mat[i][j-1] != 1){
                      return false;
                  }
              }
          }
          return true;
      }
    
  • 由于题目条件说明了 matrix 中的值不会大于 n(我没看到),那就好办多了,只要一行或一列中出现重复的数就说明为无效矩阵,所以直接双重循环 + hashset 就行了。双重循环两次,一次验证每行,一次验证每列,每次验证前清除 set,伪代码如下:
  •   public boolean checkValid(int[][] matrix) {
          set =  new set
          // 判断每一行是否符合要求
          for(int i=0;i<n;i++){
          	// 清除 set
              mat[i] = matrix[i];
              for(int j=0;j<n;j++){
              	int val = matrix[i][j];
                  // 如果 set 包含当前值直接 return false
                  // 否则 set.add(val)
              }
          }
          // 判断每一列是否符合要求
          for(int i=0;i<n;i++){
          	// 清除 set
              mat[i] = matrix[i];
              for(int j=0;j<n;j++){
              	int val = matrix[j][i];
                  // 同理
              }
          }
          return True
      }
    

你可能感兴趣的:(算法学习,#,数组,算法,java,数据结构)