这里作者就不用暴力的法解了,这里用二分查找的方法给大家解释一下。
思路:由于我们看到题目要求说是一个非递增的数组,所以我们想着在每一行里面用二分,时间复杂度也就可能是O(nlogn)。
在这里我们不能按照那种从小到大的惯性思维去解题,需要知道这一次的顺序是反着的,那么我们的二分查找也就可以反着用。
他们说是要找全部负数,也就是说我们只要每一行从左到右找到了第一个负数的位置,也就知道了负数的数目(因为在第一个负数再往左全都是负数了,题目是从大到小排序的)。
如果说我们是用模板的,那么我么也可以这样理解,假如我们找到了第一个非负数的位置,也就相对的知道了第一个负数的位置了,从而推算出数目来,这样我们就可以用模板来实现这种想法了。
class Solution {
public:
int countNegatives(vector<vector<int>>& grid) {
int i=0;
int count=0;
while(i<grid.size()){
int left=0;
int right=grid[0].size()-1;
while(left<right){
int mid=(left+right+1)/2;
if(grid[i][mid]>=0)
left=mid;
else
right=mid-1;
}
if(grid[i][left]>=0)
count+=grid[0].size()-left-1;
else
count+=grid[0].size();
i++;
}
return count;
}
};