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

  • Post author:
  • Post category:其他




题目要求

】:

杨氏矩阵

有一个二维数组.

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

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

时间复杂度小于O(N);

数组:

1 2 3

2 3 4

3 4 5

1 3 4

2 4 5

4 5 6

1 2 3

4 5 6

7 8 9



解题思路

】:

杨氏矩阵就是例如上面这样每一行每一列都是递增的矩阵。而在C语言中,我们可以把它定义为一个二维数组。只要把二维数组中每个值和目标值相比较,就能知道能不能找到这个元素。


但是题目还要求时间复杂度小于O(N),所以我们就不能一个一个的对比。

那我们可以发现,右上角和左下角的这两个数是最高效率的查找开始点。我们用上面第三个数组举例:因为右上角的3是第一行里最大的元素,是第三列里最小的元素。而左下角的7又恰好是第三行最小的元素,是第一列最大的元素。我们为什么会选择这两个数来比较呢?是因为,假如我们选择3,那么将3与目标值进行比较,如果目标值大于3,就证明不在第一行,一下子砍掉了一行,如果小于3,就证明不在第三列,也能砍掉一列。这样子来循环比较是很高效的。



参考代码

】:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define ROW 3
#define COL 3
int Findnum(int arr[ROW][COL], int row, int col, int key) {
 int left = 0;
 int right = col - 1;
 while ((left >= 0) && (right < col)) {
  //如果这个数字小于key,则向后移一位;
  if (arr[left][right] < key) {
   left++;
  }
  //如果这个数字大于key,则向前移一位;
  if (arr[left][right] > key) {
   right--;
  }
  //如果这个数字等于key,则返回1;
  if (arr[left][right] == key) {
   return 1;
  }
 }
 //否则返回1;
 return 0;
}
int main() {
 //定义一个二维数组;
 int arr[ROW][COL] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 printf("请输入要查找的数字:");
 int key = 0;
 scanf("%d", &key);
 //找到了返回1,找不到返回0;
 int ret = Findnum(arr, ROW, COL, key);
 if (1 == ret)
 {
  printf("找到了!\n");
 }
 if (0 == ret)
 {
  printf("找不到!\n");
 }
 system("pause");
 return 0;
}



版权声明:本文为weixin_43690795原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。