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

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

题目描述:


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

要求:时间复杂度小于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;
}


目录
相关文章
|
4月前
|
算法 测试技术 C#
C++二分查找算法:包含每个查询的最小区间
C++二分查找算法:包含每个查询的最小区间
|
5月前
|
算法 测试技术 C#
C++二分查找算法:查找和最小的 K 对数字
C++二分查找算法:查找和最小的 K 对数字
|
4月前
|
算法 Java C++
数据结构与算法面试题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。(提示:使用动态规划或者中心扩散)
数据结构与算法面试题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。(提示:使用动态规划或者中心扩散)
44 0
|
4月前
|
存储 算法 Java
给定一个二叉树,请你找出其中最长严格递增路径的长度。(提示:使用动态规划)
给定一个二叉树,请你找出其中最长严格递增路径的长度。(提示:使用动态规划)
14 0
|
4月前
leetcode-373:查找和最小的 K 对数字
leetcode-373:查找和最小的 K 对数字
19 0
LeetCode-373 查找和最小的K对数字
LeetCode-373 查找和最小的K对数字
|
12月前
在给定范围的数据中找到含有6的数据个数
在给定范围的数据中找到含有6的数据个数
|
存储 算法
【题型总结】找到第n个自定义数 | 丑数系列 + 神奇数字
思路:对于对于任意一个丑数 x,其与任意的质因数(2、3、5)相乘,结果(2x、3x、5x)仍为丑数。因此可以使用优先队列(小根堆)存放丑数x,每次从队列取出最小值x,并将x所对应的2x、3x和5x入队。第n次出队的值即为第n个丑数
211 0
【题型总结】找到第n个自定义数 | 丑数系列 + 神奇数字
|
算法 索引
Leetcode 40组合总数(回溯)Ⅱ&41缺失的第一个正数&42接雨水
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
78 0
Leetcode 40组合总数(回溯)Ⅱ&41缺失的第一个正数&42接雨水
|
存储 算法
找到缺失的 第一个正数
找到缺失的 第一个正数