杨氏矩阵

简介: 杨氏矩阵

1.题目要求

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在,要求算法复杂度是O(n)。(注:不一定是n*n的矩阵)

举例:

1 2 3 4

2 3 4 5

6 7 8 9

5  6  7

10 11 12

12 13 15

2.思路

思路1:也是最容易想到的,依次遍历这个二维数组,虽然不满足题目O(N)的复杂度需求,但是可以满足基本需求.

改进:我们知道,整个矩阵最大的数在右下角,最小的数在左下角,根据题目需求,假设我要找的数比第一列最右边的数大,那就跳到下一行寻找,假设小,就向左寻找.

举例:

1   6   10   15

7  10   12   16

11  20  21   33

13  21  22   34

假设我要寻找12

假设我要寻找13

3.参考代码

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
//杨氏矩阵
#define COL 4
int YangSearch(int arr[][COL], int row, int col, int key)
{
  int i = 0;
  int j = col - 1;
  if (key <arr[0][0] || key>arr[row - 1][col - 1])
    return 0;
  while (i < row && j >= 0)
  {
    if (arr[i][j] > key)
    {
      j--;
    }
    else if (arr[i][j] < key)
    {
      i++;
    }
    if (arr[i][j] == key)
    {
      return 1;
            //找到了
    }
  }
  return 0;
    //找不到
}
int main()
{
  int arr[][4] = { {1,6,10,15},{7,10,12,16},{11,20,21,33},{13,21,22,34} };
  int a = YangSearch(arr, 4, 4, 20);
  return 0;
}
相关文章
|
6月前
|
算法 C语言
杨氏矩阵查找算法
杨氏矩阵是一种特殊矩阵,其每一行和每一列都是递增的。要在一个杨氏矩阵中查找特定数值,可以从右上角或左下角开始,通过比较当前元素与目标值的大小来决定向下或向左移动,直到找到目标值或超出边界。这种方法的时间复杂度为O(N)。文中还提供了一段C语言代码实现此查找算法,并给出了牛客网上的相关练习题链接。
28 1
|
6月前
【编程题-错题集】最长回文子序列(动态规划 - 区间dp)
【编程题-错题集】最长回文子序列(动态规划 - 区间dp)
|
机器学习/深度学习
【N皇后】
【N皇后】
LeetCode题:70爬楼梯,126斐波那契数
LeetCode题:70爬楼梯,126斐波那契数
55 0
|
算法 Java
【算法题目解析】杨氏矩阵数字查找
一道面试时可能遇到的算法问题,杨氏矩阵。可以重点关注思考方式,而不是死记硬背。
41 0
|
C++
剑指offer 53. 数组中的逆序对
剑指offer 53. 数组中的逆序对
79 0
剑指offer 53. 数组中的逆序对
杨氏矩阵,字符串左旋,字符串旋转结果题目解析
杨氏矩阵,字符串左旋,字符串旋转结果题目解析
子数组问题总结(很多子数组求法类似,暴力求法)
子数组问题总结(很多子数组求法类似,暴力求法)
子数组问题总结(很多子数组求法类似,暴力求法)
|
算法
算法篇-杨氏矩阵
算法篇-杨氏矩阵
93 0
从杨氏矩阵找数
杨氏矩阵,是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。有一个二维数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N)。