8.23题目:矩阵数字查找

2024-08-24 03:04
文章标签 题目 查找 矩阵 数字 8.23

本文主要是介绍8.23题目:矩阵数字查找,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一些闲话:

小编打算给这个刷题系列改个名,以后就用日期做标题吧,哪一天写了就写哪一天的日期,

不然就跑题了,你说是吧!啊啊啊,根本做不到每日一题!!~~>_<~~

一、题目名称

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

二、思路分析:

由于矩阵的每行从左到右是递增的,矩阵从上到下也是递增的,所以我们可以从矩阵右上角开始查找。

从右上角开始寻找的话

  1. 如果当前元素大于目标元素的话,就可以排除当前列,往左移动一列继续寻找;
  2. 如果当前元素小于目标元素的话,就可以排除当前行,往下移动一行继续寻找;

比如说一个矩阵

1      4      7      11 

2      5      8      12

3      6      9      13

10    14    18    22

1、如果目标元素是8,我们从右上角开始寻找,

右上角数字是11,大于8,则根据矩阵从上到下是递增的,我们可以知道11所在列的数字均大于11,都比目标元素8大,所以最后一列就可以直接排除,向左移动一列进行查找。

2、如果目标元素是13,我们从右上角开始寻找,

先看右上角数字11,小于13,根据矩阵每行从左向右是递增的,则最右边的元素是该行最大的数字,因此第一行元素都比目标元素小,第一行元素就可以直接排除,向下移动一行进行查找。

 重复上述步骤,直到找到目标数字或者遍历完整个矩阵。

三、代码思路:

1、掌握如何声明和初始化二维数组用来表示数字矩阵

例如:int array[ ][4] = {{1,7,13,19},{3,9,15,21},{5,11,17,23},{10,16,22,28}},声明一个4行4列的矩阵

2、使用循环来查找目标元素

本题可以使用while循环来查找元素,不断根据当前元素与目标数字的大小关系调整查找位置,直到找到目标数字或者遍历完整个矩阵。while循环的条件是查找范围要在矩阵内。

3、使用条件判断

如果当前元素大于目标数字,则往左移动一列继续查找;如果当前元素小于目标数字,则往下移动一行继续查找;如果当前元素等于目标数字,则表示找到了目标数字。

4、定义一个函数findarray

该函数用来实现查找目标元素。

四、代码实现

#include <stdio.h>
//row是行数,col是列数
//rows是矩阵总行数,cols是矩阵总列数
int findarray(int array[][4], int rows, int cols, int target)
{int row = 0;//表示从第一行开始查找int col = cols - 1;//表示从最后一列开始查找while (row < rows && col > 0)//确保查找范围在矩阵内{if (array[row][col] == target)//找到了{return 1;}else if (array[row][col] > target) {col--;//向左移动一列}else{row++;//向下移动一行}}return 0;
}
int main()
{int array[][4] = { {1,7,13,19},{3,9,15,21},{5,11,17,23},{10,16,22,28} };int target = 9;scanf("%d", &target);int result = findarray(array, 4, 4, target);//调用函数来实现元素查找,并返回值if (result){printf(" %d 在矩阵中\n", target);}   else{printf(" %d 不在矩阵中\n", target);}      return 0;
}

结果展示

五、部分代码分析:

查找部分代码分析:

  • while (row < rows && col > 0)循环用于在矩阵中进行查找。只要当前行索引小于行数,且列索引大于等于 0,循环就会继续。
  • 如果当前位置的元素array[row][col]等于目标数字target,则直接返回 1,表示找到了目标数字。
  • 如果当前位置的元素大于目标数字,说明目标数字不可能在当前列中,因为每列从上到下是递增的。所以将列索引减一,即 col--,向左移动一列继续查找。
  • 如果当前位置的元素小于目标数字,说明目标数字不可能在当前行中,因为每行从左到右是递增的。所以将行索引加一,即row++,向下移动一行继续查找。

六、扩展:使用指针来改写代码

不知大家是否还记得前面小编介绍的数组传参的本质这一篇中说到二维数组传参吗?

二维数组传参传递的是一维数组的地址,所以本道题我们可以使用指针来改写一下

#include <stdio.h>int findarray(int (*array)[4], int rows, int cols, int target)
{int row = 0;int col = cols - 1;while (row < rows && col >= 0){if (array[row][col] == target){return 1;}else if (array[row][col] > target){col--;}else{row++;}}return 0;
}int main()
{int array[][4] = { {1,7,13,19},{3,9,15,21},{5,11,17,23},{10,16,22,28} };int target;scanf("%d", &target);int result = findarray(array, 4, 4, target);if (result){printf("%d 在矩阵中\n", target);}else{printf("%d 不在矩阵中\n", target);}return 0;
}

这篇关于8.23题目:矩阵数字查找的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101260

相关文章

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

AIGC6: 走进腾讯数字盛会

图中是一个程序员,去参加一个技术盛会。AI大潮下,五颜六色,各种不确定。 背景 AI对各行各业的冲击越来越大,身处职场的我也能清晰的感受到。 我所在的行业为全球客服外包行业。 业务模式为: 为国际跨境公司提供不同地区不同语言的客服外包解决方案,除了人力,还有软件系统。 软件系统主要是提供了客服跟客人的渠道沟通和工单管理,内部管理跟甲方的合同对接,绩效评估,BI数据透视。 客服跟客人

码蹄集部分题目(2024OJ赛9.4-9.8;线段树+树状数组)

1🐋🐋配对最小值(王者;树状数组) 时间限制:1秒 占用内存:64M 🐟题目思路 MT3065 配对最小值_哔哩哔哩_bilibili 🐟代码 #include<bits/stdc++.h> using namespace std;const int N=1e5+7;int a[N],b[N],c[N],n,q;struct QUERY{int l,r,id;}que