我是靠谱客的博主 酷炫茉莉,最近开发中收集的这篇文章主要介绍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
采用二分法缩小查找范围
基于以上思路编写代码。

最后

以上就是酷炫茉莉为你收集整理的LeetCode刷题记录 --统计有序矩阵中的负数的全部内容,希望文章能够帮你解决LeetCode刷题记录 --统计有序矩阵中的负数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部