【万人千题】一些有关矩阵题目的解题报告

1,1351. 统计有序矩阵中的负数 - 力扣(LeetCode) (leetcode-cn.com)

int countNegatives(int** grid, int gridSize, int* gridColSize)
{
     int row=gridSize;
     int col=gridColSize[0];
     int count=0;
     int i=0;
     for(i=0;i<row;i++)
     {
         int j=0;
         for(j=0;j<col;j++)
         if(grid[i][j]<0)
         count++;
     }
    return count;
}

遍历数组,寻找目标数即可。

2,1572. 矩阵对角线元素的和 - 力扣(LeetCode) (leetcode-cn.com)

int diagonalSum(int** mat, int matSize, int* matColSize)
{
     int row=matSize;
     int col=*matColSize;
     int i=0;
     int sum=0;
     for(i=0;i<row;i++)
     {
         sum+=mat[i][i];
     }
     for(i=row-1;i>=0;i--)
     {
         sum+=mat[i][row-i-1];
     }
     if(matSize%2!=0)
     {
         sum-=mat[matSize/2][matSize/2];
     }
     return sum;
}

找到对角线的规律,注意列数是奇数时减去一个最中间的数即可。

3,1672. 最富有客户的资产总量 - 力扣(LeetCode) (leetcode-cn.com)

int maximumWealth(int** accounts, int accountsSize, int* accountsColSize)
{
        int row=accountsSize;
        int col=accountsColSize[0];
        int sum=0;
        int i=0;
        int j=0;
        for(j=0;j<col;j++)
        sum+=accounts[i][j];
        for(i=1;i<row;i++)
        {
            j=0;
            int tmp=0;
            for(;j<col;j++)
             tmp+=accounts[i][j];
             if(tmp>sum)
             sum=tmp;
        }
        return sum;
}

遍历相加,取最大即可。

4,766. 托普利茨矩阵 - 力扣(LeetCode) (leetcode-cn.com)

bool isToeplitzMatrix(int** matrix, int matrixSize, int* matrixColSize)
{
    int row=matrixSize;
    int col=matrixColSize[0];
    int i=0;
    for(i=0;i<row;i++)
    {
        int j=i+1;
        int k=1;
        //int max=col>row?col:row;
        for(;j<row&&k<col;j++,k++)
        {
            if(matrix[j][k]!=matrix[i][0])
             return false;
        }
    }
    for(i=1;i<col;i++)
    {
        int j=1;
        int k=i+1;
        // int max=col>row?col:row;
        for(j=1;j<row&&k<col;j++,k++)
        {
            if(matrix[j][k]!=matrix[0][i])
              return false;
        }
    }
    return true;
}

思路是从0行和0列分别开始,0行的先全试完,然后0列的去试,注意找到对角线的规律。还有一个需要注意的点是,从0行,0列分别开始的原因是其是最开始的数,如果后面的数一旦没有与其相等就不需要再判断了。也就是作为基准的数已经确定了,只需要变比较的数即可。

5,1380. 矩阵中的幸运数 - 力扣(LeetCode) (leetcode-cn.com)

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 bool num(int** arr,int i,int j,int row,int col)
 {
     int m=0;
     for(m=0;m<row;m++)
     {
         if(m==i)
         continue;
         if(arr[i][j]<arr[m][j])
           return false;
     }
     for(m=0;m<col;m++)
     {
         if(m==j)
         continue;
         if(arr[i][j]>arr[i][m])
          return false;
     }
     return true;
 }
int* luckyNumbers (int** matrix, int matrixSize, int* matrixColSize, int* returnSize)
{
     int*ans=(int*)malloc(sizeof(int)*matrixSize);
     int i=0;
     int count=0;
     for(i=0;i<matrixSize;i++)
     {
         int j=0;
         for(j=0;j<*matrixColSize;j++)
         {
             if(num(matrix,i,j,matrixSize,*matrixColSize))
               {
                   ans[count]=matrix[i][j];
                   count++;
               }
         }
     }
     *returnSize=count;
     return ans;
}

//解法二:
// int* luckyNumbers (int** matrix, int matrixSize, int* matrixColSize, int* returnSize)
// {
//     int row=matrixSize;
//     int col=*matrixColSize;
//      int*ans=(int*)malloc(sizeof(int)*matrixSize);
//      int i=0;
//      int count=0;
//      for(i=0;i<matrixSize;i++)
//      {
//          int j=0;
//          for(j=0;j<col;j++)
//          {
//                  int m=0;
//             for(m=0;m<row;m++)
//            {
//          if(m==i)
//          continue;
//          if(matrix[i][j]<matrix[m][j])
//            goto again;
//           }
//         for(m=0;m<col;m++)
//           {
//          if(m==j)
//          continue;
//          if(matrix[i][j]>matrix[i][m])
//             goto again;
//           }
//          ans[count]=matrix[i][j];
//                     count++;
//         again:
//         ;   
//          }
//      }
//      *returnSize=count;
//      return ans;
// }

两种解法,但是大同小异,一种用函数,一种没用。思路就是遍历数组,一个一个去比,放入函数中,然后在函数中把对应的行和列确定下来,一个一个和目标数进行对比,一旦出现预期外的结果就返回false,若都过了就会返回true。这样即可找到数字。

6,1582. 二进制矩阵中的特殊位置 - 力扣(LeetCode) (leetcode-cn.com)

bool judge(int**mat,int i,int j,int row,int col)
{
    int m=0;
    for(;m<row;m++)
    {
        if(m==i)
        continue;
        if(mat[m][j]!=0)
        return false;
    }
    for(m=0;m<col;m++)
    {
        if(m==j)
        continue;
        if(mat[i][m]!=0)
        return false;
    }
    return true;
}
int numSpecial(int** mat, int matSize, int* matColSize)
{
     int row=matSize;
     int col=*matColSize;
     int i=0;
     int count=0;
     for(i=0;i<row;i++)
     {
         int j=0;
         for(j=0;j<col;j++)
         {
             if(mat[i][j]==1)
             if(judge(mat,i,j,row,col))
             count++;
         }
     }
     return count;
}

与上一题思路其实差不多,这题会更简洁一点,找到对应行列元素,看看是不是0即可。返回后count++,即可找到一共有几个数。

上一篇:C语言实现拼图


下一篇:【大数据简答题】hive简答10题