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;
}
};
结束咧