【C语言】杨氏矩阵中寻找元素

题目名称:

杨氏矩阵

题目内容:

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

形如这样的矩阵就是杨氏矩阵(本质上是一个二维数组)

要求:

时间复杂度小于O(N)

解题思路:

因为题目要求时间复杂度小于O(N),所以我们不能用暴力枚举遍历去解决这道题。

如何去简化时间复杂度呢?

我们首先要知道具体简化的点在哪里,O(N)是因为我们遍历一个一个去排除,最差的情况下,我们需要排除n次,因为遍历一次,排除1个。那我们就有这样的简化思想,遍历一次,可以排除多个元素,这样时间复杂度肯定小于O(N)。

带着这样的思路去想,我们发现最右上角的元素很特殊

因为它是一行中最大的元素,也是一列中最小的元素。

如果比它小,直接排除列。

如果比它大,直接排除行

并且这样的方法可以一直循环下去,直到遍历完整个数组

这也就相当于我们遍历了一个元素,可以排除一行/一列的元素,大大减少了时间复杂度,满足题目要求。

TIP:如何自定义函数返回两个值?

我们知道函数的返回值只能返回一个值,如果题目要求我们返回两个甚至更多的值怎么办呢?

这个时候我们就可以利用函数的参数,我们传参,传我们需要返回参数的地址过去,这样在自定义函数中我们就可以返回我们想要的参数!

源码:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/28314.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows bat隐藏运行窗口的几种方案

文章目录 一、背景二、测试数据三、隐藏bat运行窗口方案1. 使用VBScript脚本2. 使用mshta调用js或vbs脚本3. 将bat编译为exe程序4. 使用任务计划程序 一、背景 有些程序在执行批处理脚本时&#xff0c;可能会看到dos窗口&#xff0c;或者看到窗口一闪而过。如果批处理脚本执行…

【AUTOSAR】:车载以太网

车载以太网 References参考文献车载以太网的物理连接MACPHYPHY的主从关系100BASE-T1回音消除车载以太网的应用层协议References参考文献 汽车软件通信中间件SOME/IP简述100BASE-T1以太网:汽车网络的发展车载以太网的物理连接 MAC MAC(Media Access Control介质访问)一般集成…

【VirtualBox】安装 VirtualBox 提示 needsthe Microsoft Visual C++ 2019

概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、开发环境 开发环境&#xff1a;windows10虚拟机&#xff1a;VirtualBox 7.0.8 二、报错 ubun…

23.JavaWeb-集群+Nginx+JMeter

1.集群概念 平时用的服务是的并发量是有限的&#xff0c;像tomcat只有不到500的并发量&#xff0c;不能满足高并发的需求&#xff0c;因此就采用了集群的方法&#xff0c;用多个服务器 当用户请求集群系统时&#xff0c;集群给用户的感觉就是一个单一独立的服务器&#xff0c;而…

基于STM32 ARM+FPGA伺服控制系统(二)软件及FPGA设计

完整的伺服系统所包含的模块比较多&#xff0c;因此无法逐一详细介绍&#xff0c;所以本章着重介绍 设计难度较高的 FPGA 部分并简单介绍 ARM 端的工作流程。 FPGA 部分主要有 FOC 算法、电流采样算法及编码器采样算法&#xff0c;是整个控制系统的基础&#xff0c;直接…

ELK-日志服务【redis-配置使用】

目录 环境 【1】redis配置 【2】filebeat配置 【3】对接logstash配置 【4】验证 【5】安全配置&#xff1a;第一种&#xff1a;kibana-nginx访问控制 【6】第二种&#xff1a;在ES-主节点-配置TLS 【7】kibana配置密码 【8】logstash添加用户密码 环境 es-01,kibana 1…

ChatGPT 最佳实践指南之:系统地测试变化

Test changes systematically 系统地测试变化 Improving performance is easier if you can measure it. In some cases a modification to a prompt will achieve better performance on a few isolated examples but lead to worse overall performance on a more representa…

C++类和对象——类的基础

目录 类的引入类的定义类的访问限定符和封装对象的实例化类对象的大小this指针 类的引入 在C语言中&#xff0c;结构体中只能定义变量 但是在C中&#xff0c;结构体不仅可以定义变量&#xff0c;还可以定义函数 下面就是C中的一个结构体&#xff1a; struct Stack {void init(…

《Linux0.11源码解读》理解(五) head之开启分页

先回顾一下地址长度以及组合的演变&#xff1a;16位cpu意味着其数据总线/寄存器也是16位&#xff0c;但是地址总线&#xff08;寻址能力&#xff09;与此无关&#xff0c;可能是20位。可以参考&#xff1a;cpu的位宽、操作系统的位宽和寻址能力的关系_cpu位宽_brahmsjiang的博客…

Android TextView 在最后一行末尾加图标

当前有个需求.显示一段文本&#xff0c;文本最多显示两行&#xff0c;点击展开后才显示完全。当没有显示完全的时候&#xff0c;需要在文本的第二行末尾显示图标&#xff0c;点击图标和文本&#xff0c;文本展开。难点在于图标需要和第二行文本显示在同一行&#xff0c;高度和文…

oracle 如何连同空表一起导出成dmp的方法

1、oracle导出dmp文件的时候&#xff0c;经常会出现一些空表&#xff0c;没有一并被导出的情况。 执行sql select alter table ||table_name|| allocate extent; from user_tables where num_rows0 or num_rows is null; 新建一个sql窗口&#xff0c;把查询结果的sql&#…

Pytorch自动求导机制详解

目录 1. 自动求导 1.1 梯度计算 1.1.1 一阶导数 1.1.2 二阶导数 1.1.3 向量 1.2 线性回归实战 1. 自动求导 在深度学习中&#xff0c;我们通常需要训练一个模型来最小化损失函数。这个过程可以通过梯度下降等优化算法来实现。梯度是函数在某一点上的变化率&#xff0c;可以告…