当前位置: 首页 > news >正文

C语言——实现杨氏矩阵

什么是杨氏矩阵?

概念:

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增

eg:

1 2 3
4 5 6 
7 8 9

题目:

请编写程序在这样的矩阵中查找某个数字是否存在。

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

分析:

我们仔细分析,不难发现,对于杨氏矩阵来说,

右上角和左下角的元素是有特点的。

右上角的元素是一行中最大的,一列中最小的。

左下角的元素是一行中最小的,是一列中最大的。

所以我们可以从右上角或者左下角开始查找。

比如:

从右上角开始查找的时候,右上角的元素比我们要查找元素小,我们就可以去掉右上角元素所在的这一行;

右上角的元素比我们要查找的元素大,我们就可以去掉右上角元素所在的这一列。

然后依然找右上角的元素继续和要查找的元素与比较。

这样每一次比较去掉一行或者去掉一列。

这个查找效率是高于遍历数组元素的,所以时间复杂度是小于O(N),也满足题目要求。 

find_k(int arr[3][3], int r, int c,int k)
{int x = 0;int y = c - 1;while (1){if (arr[x][y] < k){arr[x][y] = arr[x++][y];//x++;}else if (arr[x][y] > k){arr[x][y] = arr[x][y--];//y--;}else{printf("找到了,位置为%d,%d", x, y);break;}}
}
int main()
{int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };int k = 7;find_k(arr, 3, 3,k);return 0;
}

优化:传地址过去,可以直接返回到主函数判断

int find_k(int arr[3][3], int *px, int *py, int k)
{int x = 0;int y = *py-1;int flag = 0;while (x <= *px - 1 && y>=0){if (arr[x][y] < k){x++;}else if (arr[x][y] > k){y--;}else{*px = x;*py = y;flag = 1;return 1;}}if (flag == 0)return 0;}
int main()
{int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };int k = 7;int x = 3;int y = 3;int ret =find_k(arr,&x,&y,k);if (ret == 0)printf("找不到了");if(ret ==1)printf("下标为%d,%d", x,y);return 0;
}

http://www.lryc.cn/news/506344.html

相关文章:

  • 授权模型PAM
  • 【Leecode】子集⭐⭐
  • Linux高性能服务器编程 | 读书笔记 | 12. 多线程编程
  • [HNCTF 2022 Week1]baby_rsa
  • 解析Java中的Stream API:函数式编程与性能优化
  • java简单题目练习
  • Kaggler日志--Day9
  • OpenCVE:一款自动收集NVD、MITRE等多源知名漏洞库的开源工具,累计收录CVE 27万+
  • 麒麟信安参编的《能源企业数字化转型能力评价 技术可控》团体标准发布
  • 戴尔物理机更换完Raid控制器(阵列卡),启动服务器失败
  • 计算机基础知识——数据结构与算法(二)(山东省大数据职称考试)
  • docsify
  • GEE教程——使用 CHIRPS 和 GSMaP 数据集计算并可视化了特定区域的降水量
  • 前端实现页面自动播放音频方法
  • 【Nginx-5】Nginx 限流配置指南:保护你的服务器免受流量洪峰冲击
  • 【芯片设计- RTL 数字逻辑设计入门 番外篇 7.1 -- 基于ATE的IC测试原理】
  • SurfaceFlinger 学习
  • Flink SQL 从一个SOURCE 写入多个Sink端实例
  • python飞机大战游戏.py
  • 【C++】14___String容器
  • 数据特性库 前言
  • jdk和cglib动态代理区别
  • 部署Mysql、镜像和容器、常见命令
  • 【数学】P2671 [NOIP2015 普及组] 求和
  • 【AI图像生成网站Golang】项目测试与优化
  • vue常用自定义指令
  • 以太网帧、IP数据报图解
  • 01.大模型起源与发展
  • leetcode刷题日记03——javascript
  • vue横向滚动日期选择器组件