概述
题目描述如下:
给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。
请你统计并返回 grid 中 负数 的数目。
先上代码
// An highlighted block
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> arr1 = {{4,3,2,-1},{3,2,1,-1},{1,1,-1,-2},{-1,-1,-2,-3}};
vector<vector<int>> arr2 = {{3,2},{1,0}};
vector<vector<int>> arr3 = {{1,-1},{-1,-1}};
int get_min(vector<int>& arr, int targe)
{
if(arr.size() == 0)
return -1;
int r = arr.size();
int l = 0;
while(l < r)
{
int m = (r+l) / 2;
if(arr[m] == targe)
{
while(arr[m] == targe)
{
m++;
}
return arr.size() - m;
}
else if(arr[m] < targe)
{
while(arr[m] < targe)
{
m--;
}
return arr.size() - m - 1;
}
else
l = m+1;
}
return -1;
}
int get_min_plus(vector<vector<int>> &arr)
{
int sum = 0;
for(vector<vector<int>>::iterator ptr = arr.begin();ptr != arr.end();ptr++)
{
int temp = get_min(*ptr,0);
if(temp == -1)
{
cout<<"some error" << endl;
break;
}
sum += temp;
}
return sum;
}
int main()
{
int result = get_min_plus(arr3);
cout<< "the result is:" << result;
}
三个vector均测试通过。
本题的基本思路是,先定义一个函数get_min()对一维数组进行处理,在定义一个plus函数调用前者处理二维数组;
get_min()中采用二分查找法,l是左边界,r是右边界。
对其二分查找可能出现三种情况:
1.等于0
向右查找,直到找到小于0的数,返回大小;
2.小于0
向左查找,直到找到大于0的数,返回大小;
3.大于0
采用二分法缩小查找范围
基于以上思路编写代码。
最后
以上就是酷炫茉莉为你收集整理的LeetCode刷题记录 --统计有序矩阵中的负数的全部内容,希望文章能够帮你解决LeetCode刷题记录 --统计有序矩阵中的负数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复