ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-11-29 23:05:37  阅读:167  来源: 互联网

标签:cn int sum 矩阵 解题 万人千题 com col row


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++,即可找到一共有几个数。

标签:cn,int,sum,矩阵,解题,万人千题,com,col,row
来源: https://blog.csdn.net/C_Ryson/article/details/121621680

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有