【那些年那些题】杨氏矩阵查找目标数

简介: 【那些年那些题】杨氏矩阵查找目标数

题目描述:


有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。

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


思路分析:


最简单粗暴的查找方法就是逐个元素进行遍历,但是这样时间复杂度是O(N),不满足题目要求,所以需要观察这个杨氏矩阵具备什么样的特性或者规逻辑规律。

 每一行的第一个数为该行最小的数,如果这个数仍比要找的数大那么这一行就没有要找的数(每一列也是同理);每一行的最后一个数为该行最大的数,如果这个数仍比要找的数小,那么这一行就没有数比要找的数大(每一列也是同理)。

 所以我们只需要先利用排除一行(列)的特性,缩小查找范围,然后再逐个元素进行查找即可。同时也满足了时间复杂度小于O(N)的条件。


编程逻辑:


 从第一行最后一列开始比较,如果第一行最后一列的数小于要查找的数,那么直接用下一行最后一列的数进行比较;如果第一行最后一列的数大于要查找的数,那么列数就减一,再次进行比较,这里就是逐元素进行比较了。

 当然,我们也可以从最后一行第一列开始比较,逻辑方法是一样的。


dccbd2cf922e4042a350e3cf98aa4ce7.png


代码实现:

void find_num(int a[3][3], int key, int c, int r) {
  int i = 0;
  int j = r - 1;
  int flag = 1;
  while (i < c && j >= 0) {
    if (a[i][j] < key) {
      i++;
    }
    else if (a[i][j] > key) {
      j--;
    }
    else {
      flag = 0;
      printf("找到了,下标是%d,%d", i, j);
      break;
    }
  }
  if (flag)
    printf("找不到!");
}
int main() {
  int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
  int key;
  scanf("%d", &key);
  find_num(a, key, 3, 3);
  return 0;
}


目录
相关文章
|
6月前
|
算法 测试技术 C#
C++二分查找算法:包含每个查询的最小区间
C++二分查找算法:包含每个查询的最小区间
|
11月前
|
算法 测试技术 C#
C++二分查找算法:查找和最小的 K 对数字
C++二分查找算法:查找和最小的 K 对数字
|
6月前
|
算法 测试技术 C#
【数学】LeetCode1526: 形成目标数组的子数组最少增加次数
【数学】LeetCode1526: 形成目标数组的子数组最少增加次数
|
6月前
|
索引
leetcode-448:找到所有数组中消失的数字
leetcode-448:找到所有数组中消失的数字
35 0
|
6月前
leetcode-373:查找和最小的 K 对数字
leetcode-373:查找和最小的 K 对数字
41 0
|
存储
LeetCode题:88合并两个有序数组,283移动零,448找到所有数组中消失的数字
LeetCode题:88合并两个有序数组,283移动零,448找到所有数组中消失的数字
68 0
在给定范围的数据中找到含有6的数据个数
在给定范围的数据中找到含有6的数据个数
|
存储 算法
【题型总结】找到第n个自定义数 | 丑数系列 + 神奇数字
思路:对于对于任意一个丑数 x,其与任意的质因数(2、3、5)相乘,结果(2x、3x、5x)仍为丑数。因此可以使用优先队列(小根堆)存放丑数x,每次从队列取出最小值x,并将x所对应的2x、3x和5x入队。第n次出队的值即为第n个丑数
257 0
【题型总结】找到第n个自定义数 | 丑数系列 + 神奇数字
|
索引
力扣刷题记录——434. 字符串中的单词数、448. 找到所有数组中消失的数字、455. 分发饼干
力扣刷题记录——434. 字符串中的单词数、448. 找到所有数组中消失的数字、455. 分发饼干
123 0
力扣刷题记录——434. 字符串中的单词数、448. 找到所有数组中消失的数字、455. 分发饼干