杨氏矩阵查找算法

简介: 杨氏矩阵是一种特殊矩阵,其每一行和每一列都是递增的。要在一个杨氏矩阵中查找特定数值,可以从右上角或左下角开始,通过比较当前元素与目标值的大小来决定向下或向左移动,直到找到目标值或超出边界。这种方法的时间复杂度为O(N)。文中还提供了一段C语言代码实现此查找算法,并给出了牛客网上的相关练习题链接。

一、杨氏矩阵介绍


杨氏矩阵种,每一行的数都从左到右递增,每一列的数都从上到下递增。如下图是一个简单的杨氏矩阵:



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

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



二、查找算法


1.查找思路


杨氏矩阵是很有特点的,它有规律递增的特点决定了针对表中的任一元素,它的下方和右方的数一定大于我,左方和上方的数一定小于我,所以查找的时候可利用这一特点,从右上角或者左下角来找。


因为这两个位置的大于小于有区分度。例如,若选择从右上角找,那么没有上边和右边,而下边一定比我大,左边一定比我小。那么,如果要查找的数比遍历到的元素大,那我就向下查找;如果比遍历到的元素小,那我就向左查找。


这样查找的次数只有x+y-1次,符合题目中要求的O(n)。


2.步骤






3.代码


int Check(int a[ROW][COL],int row,int col,int k) {
  int x = 0;
  int y = col - 1;
  while(x <= row-1 && y >= 0){
    if (k > a[x][y]) {    //比我大就向下
      x++;
    }
    else if (k < a[x][y]) {    //比我小就向左
      y--;
    }
    else {
      return 1;    //相等:找到了
    }
  }
  return 0;    //没有找到
}
 
int main() {
  int a[ROW][COL] = { {1,2,3,4},{5,6,7,8},{9,10,11,12}};//示例
  int k = 0;    //要查找的数
 
  printf("请输入你要找的数:\n");
  while(~scanf("%d", &k)){
    if (Check(a, ROW, COL, k)) {
      printf("找到了!\n");
    }
    else {
      printf("该数不存在!\n");
    }
  }
 
  return 0;
}



三、杨氏矩阵例题


牛客网习题链接


https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e






代码


该题相当于是前面杨氏矩阵查找的直接运用。注意,当题干中出现 “一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序 这样的描述时,要立马反应过来它是杨氏矩阵。可能不会每道题的矩阵都像{{1,2,3,4},{5,6,7,8},{9,10,11,12}}这样规整,但只要关注并发现它的行按一定顺序(从左到右或从右到左)递增,且列也按一定顺序(从上到下或从下到上)递增,那么就可以运用杨氏矩阵算法。(有时候可能题干数组会是从右向左递增,从下向上递增,刚好和杨氏矩阵反一反,但方法通用。)



bool Find(int target, int** array, int arrayRowLen, int* arrayColLen ) {
  int x = 0;
  int y = *arrayColLen - 1;
  while(x < arrayRowLen && y >= 0){
    if(array[x][y] > target) {
      y--;
    }else if(array[x][y] < target) {
      x++;
    }else{
      return true;
    }
  }
  return false;
}


特别注意


针对这串代码,这里必须附上特别说明。传二维数组入函数,函数头写了形参为int** array,注意这并不是直接传二维数组名时的形参接收方式。

若实参部分直接传二维数组数组名array,则形参应写为:


//列参数不可省略
void fun(int array[][col]);

 


//一维数组指针
void fun(int (*array)[col]);


而用int** array接收,则调用方应该这样写:


#include<stdio.h>
 
bool Find(int target, int** array, int arrayRowLen, int* arrayColLen ) {
  int x = 0;
  int y = *arrayColLen - 1;
  while(x < arrayRowLen && y >= 0){
    if(array[x][y] > target) {
      y--;
    }else if(array[x][y] < target) {
      x++;
    }else{
      return true;
    }
  }
  return false;
}
 
int main(){
  int a1[]={1,2,8,9};
  int a2[]={2,4,9,12};
  int a3[]={4,7,10,13};
  int a4[]={6,8,11,15};
  
  int* p[] = {a1,a2,a3,a4};
  int arrayRowLen = 4;
  int arrayColLen = 4;
    //传入指针数组的数组名,数组p内的元素是指针类型,存放的是另外四个一维数组名
  printf("%d",Find(100, p,arrayRowLen ,&arrayColLen));
  
  return 0;
}


四、总结


概括来说,杨氏矩阵查找的算法是根据杨氏矩阵中数递增规律特点设计的,而这种设计算法的思路可以迁移。若题干变换为其它类型的、其中数具有变化规律的矩阵,要能想起杨氏矩阵的查找算法,并尝试将这种设计的思路迁移到变式中去。

相关文章
|
10月前
|
人工智能 自然语言处理 搜索推荐
企业客户服务效率低、体验差,如何通过大模型技术改善?一文了解面向客户服务全场景的行业大模型的3大应用方向
本文三桥君探讨了大模型技术在客户服务领域的应用与实践。从架构设计出发,详细解析了面向客户、客服和运营三大场景的智能功能模块,包括业务咨询、情感关怀、智能点选、知识采编等12项核心功能。AI产品专家三桥君指出,通过行业大模型定制、多源数据整合等技术手段,企业可实现客户服务的智能化升级,显著提升客户体验和运营效率。
527 0
|
存储 缓存 网络协议
阿里云特惠云服务器99元与199元配置与性能和适用场景解析:高性价比之选
2025年,阿里云长效特惠活动继续推出两款极具吸引力的特惠云服务器套餐:99元1年的经济型e实例2核2G云服务器和199元1年的通用算力型u1实例2核4G云服务器。这两款云服务器不仅价格亲民,而且性能稳定可靠,为入门级用户和普通企业级用户提供了理想的选择。本文将对这两款云服务器进行深度剖析,包括配置介绍、实例规格、使用场景、性能表现以及购买策略等方面,帮助用户更好地了解这两款云服务器,以供参考和选择。
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
828 25
|
机器学习/深度学习 数据采集 算法
【阿旭机器学习实战】【35】员工离职率预测---决策树与随机森林预测
【阿旭机器学习实战】【35】员工离职率预测---决策树与随机森林预测
|
数据采集 监控 数据挖掘
静态IP代理的应用场景及企业使用指南
静态IP代理提供固定IP地址,具备高稳定性和安全性,适用于跨境电商、社交媒体管理、SEO、网络数据采集、远程办公及爬虫分析等场景。企业通过选择可靠的供应商、配置网络设置并合理应用,可有效提升业务效率和安全性。例如,某电商公司利用静态住宅代理IP进行数据采集,成功分析竞争对手策略,实现销售额20%的增长。
668 1
|
存储 前端开发 Android开发
GB28181设备接入侧录像查询和录像下载技术探究之实时录像
我们在对接GB28181设备接入侧的时候,除了常规实时音视频按需上传外,还有个重要的功能,就是本地实时录像,录像后的数据,在执法记录仪等前端设备留底,然后,到工作站拷贝到专门的平台。
469 1
|
存储 SQL 消息中间件
Hologres+Flink企业级实时数仓核心能力介绍
通过Hologres+Flink构建易用、统一的企业级实时数仓。
|
缓存 运维 监控
成为工程师 - 如何提升系统稳定性(1)
成为工程师 - 如何提升系统稳定性(1)
|
数据采集 人工智能 文字识别
ADB命令来捕获设备屏幕快照和发送鼠标事件来实现抓取公众号文章
ADB命令来捕获设备屏幕快照和发送鼠标事件来实现抓取公众号文章。解决方案: 1.通过ADB命令来捕获设备屏幕快照,传递给电脑并且保存在本地文件; 2.通过百度飞桨ocr解析图片获取内容并保存; 3.根据解析的内容和坐标,向手机发送鼠标事件(点击和上下,左右滑动)来控制页面的跳转。
447 1
小功能⭐️Unity解决物体移动速度过快不能检测到碰撞
小功能⭐️Unity解决物体移动速度过快不能检测到碰撞