0
点赞
收藏
分享

微信扫一扫

力扣二分查找学习计划 第八天

君心浅语 2022-04-14 阅读 66

1351. 统计有序矩阵中的负数

 由于每行每列都是非递增排列,所以对单行或者单列可以使用二分查找第一个负数在哪,然后计算出每行或者每列的负数个数,加起来就是答案了

class Solution {
public:
    int countNegatives(vector<vector<int>>& grid) {
        int m=grid.size(),n=grid[0].size();
        int ans=0;
        for(int i=0;i<m;i++){
            int p=0,q=n-1;
            while(p<q){
                int mid=p+(q-p)/2;
                if(grid[i][mid]>=0){
                    p=mid+1;
                }
                else{
                    q=mid;
                }
            }
            if(q!=n-1){
                ans+=(n-q);
            }
            else{
                if(grid[i][q]<0){
                    ans++;
                }
            }
        }
        return ans;
    }
};

但是这样并没有充分用到每行每列都是非递增的条件,只用到了一部分,在前面做二分的时候就有想到,如果逐行使用二分的话,下一行的右边界其实是可以更新的,下一行的右边界肯定不会超过此行第一个负数的位置,所以可以对这个二分进行优化,但是这么写有点麻烦,我相信题解肯定有这么写的,于是我打算直接去抄过来。

然后发现官方题解的第四个方法 倒序遍历思想是差不多的,只不过他没有用二分,也是把代码粘过来了呀

class Solution {
public:
    int countNegatives(vector<vector<int>>& grid) {
      int m=grid.size(),n=grid[0].size();
      int p=n-1;
      int ans=0;
      for(int i=0;i<m;i++){
          for(p;p>=0;p--){
              if(grid[i][p]>=0){
                ans+=(n-p-1);
                  break;
              }
          }
          if(p<0){
              ans+=n;
          }
      }
      return ans;
    }
};

​​​​​​74. 搜索二维矩阵

 逐行遍历的话会发现整个数组是递增的,可以看成是一维数组,快对他使用二分查找!

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m=matrix.size(),n=matrix[0].size();
        if(matrix[m-1][n-1]==target){
            return 1;
        }
        int p=0,q=m*n-1;
        while(p<q){
            int mid=p+(q-p)/2;
            int x=mid/n,y=mid%n;
            if(matrix[x][y]==target){
                return 1;
            }
            else if(matrix[x][y]>target){
                q=mid;
            }
            else{
                p=mid+1;
            }
        }
        return 0;
    }
};

结束咧

 

举报

相关推荐

0 条评论