杨氏矩阵 有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N) 数组: 1 2 3 4 5

版权声明:转载请注明出处 https://blog.csdn.net/Hanoi_ahoj/article/details/83509064

如有不足,还请指正!

题目

杨氏矩阵

有一个二维数组.

数组的每行从左到右是递增的,每列从上到下是递增的.

在这样的数组中查找一个数字是否存在。

时间复杂度小于O(N)

数组:

1 2 3

4 5 6

7 8 9


正文

思路:

如果一个一个对比的话,时间复杂度为O(n)。

扫描二维码关注公众号,回复: 3808060 查看本文章

因为对于左上角的元素来说,行列后面的元素都是比他大的,对于右下角元素来说,都是比他小的。

我们需要每对比一次,减少一些工作量,而不是一个,如果这个数比我们要找的数小,我们就把比这个数小的全部“删去”,如果这个数比我们要找的大,一样。这样我们就需要一个数,他的两边有大有小。这样每次比对完后就可以减少一部分工作量。

假设要查找的数字为5

从右上角的那个数字3开始,如果右上角的数字等于要查找的,返回1

右上角数字 < 要查找的值:删除这一行

右上角数字 > 要查找的值:删除这一列

码儿如下~

#include <stdio.h>

int t2(int arr[][3], int row, int col, int value);

int main(int argc, const char * argv[])
{
    //t1();
    
    int arr[][3] =
    {
        {1,2,3},
        {4,5,6},
        {7,8,9}
    };
    if(t2(arr, 3, 3, 1))
    {
        printf("1\n");
    }
    else
    {
        printf("0\n");
    }
    return 0;
}

int t2(int arr[][3], int row, int col, int value)
{
    int ret = 0;
    
    // i,j为右上角坐标
    int i = 0;
    int j = col-1;
    while(i<row && j>=0)
    {
        if(value == arr[i][j])
        {
            ret = 1;
            break;
        }
        else if(arr[i][j] > value)
        {
            --j;
        }
        else
        {
            ++i;
        }
    }
    
    return ret;
}

如有不足,还请指正!

猜你喜欢

转载自blog.csdn.net/Hanoi_ahoj/article/details/83509064