LeetCode刷题记录 --统计有序矩阵中的负数

题目描述如下:
给你一个 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
采用二分法缩小查找范围
基于以上思路编写代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值