版权声明:转载请注明出处 https://blog.csdn.net/Hanoi_ahoj/article/details/83509064
如有不足,还请指正!
题目
杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N)
数组:
1 2 3
4 5 6
7 8 9
正文
思路:
如果一个一个对比的话,时间复杂度为O(n)。
因为对于左上角的元素来说,行列后面的元素都是比他大的,对于右下角元素来说,都是比他小的。
我们需要每对比一次,减少一些工作量,而不是一个,如果这个数比我们要找的数小,我们就把比这个数小的全部“删去”,如果这个数比我们要找的大,一样。这样我们就需要一个数,他的两边有大有小。这样每次比对完后就可以减少一部分工作量。
假设要查找的数字为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;
}