首页 > 其他分享 >杨氏矩阵

杨氏矩阵

时间:2023-09-13 18:33:22浏览次数:32  
标签:int 元素 矩阵 查找 杨氏 key

题目描述:

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

根据题目要求我们可以利用二维数组实现一个杨氏矩阵。

如下图所示,我们可以看到矩阵每行从左到右递增,从上到下递增。

杨氏矩阵_时间复杂度


在这样的二维数组中去查找一个数是否存在,我们可以从头遍历一次二维数组,如果可以找到,则元素在矩阵中,否则该矩阵中没有要查找的元素,这种方法下,时间复杂度是O(N)。

但是如果题目更改要求,要求时间复杂度小于O(N),那么我们该怎么做呢?

分析杨氏矩阵,我们发现矩阵中存在着一些特殊位置的元素,比如说矩阵右上角的元素,这个元素是其所处行的最大元素,是其所处列的最小元素。那么在输入查找元素key后,我们可以以该元素为比较出发点:

如果key<3:

杨氏矩阵_二维数组_02

那么由于3是最后一列上最小的元素,而key比3还要小,所以key肯定不会在最后一列上,这样我们就可以直接排除最后一列,列指向第二列,继续向前查找。

如果key>3:

杨氏矩阵_杨氏矩阵_03

那么由于3是第一行上最大的元素,而key比3还要大,所以key肯定不会在第一行上,这样我们就可以直接排除第一行,行指向第二行,继续向下查找。

如果key==3:

杨氏矩阵_二维数组_04

那么矩阵中存在元素key,可以直接返回。

.....

就这样每次都从矩阵右上角的元素开始查找,一次排除一行或者一列,则可以实现时间复杂度小于O(N)。

查找最后有两种结果:

  • 找到key值,返回。
  • 行值自增超过矩阵行数2/列值自减<0,查找结束。


最后附上代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//杨氏矩阵
int main()
{
	int arr[3][3] = { {1,2,3},{3,4,5},{5,6,7} };
	int k = 0;
	scanf("%d", &k);
	int row = 3;
	int col = 3;
	int i = 0;
	int j = col-1;
	while(i<row)
	{
		while(j>=0)
		{
			if (k < arr[i][j])
			{
				j--;
			}
			else if (k > arr[i][j])
			{
				i++;
			}
			else
			{
				printf("找到了,下标为%d,%d", i, j);
				return 0;
			}
		}
		if (j < 0)break;
	}
	printf("%d不在该矩阵中\n",k);

	return 0;
}


以上就是杨氏矩阵查找在时间复杂度小于O(N)情况下的解法,如果文章有错误或不妥之处,欢迎评论区留言或私信指出,希望文章对您有帮助,如果觉得文章不错的话请给一个一键三连,我们下期再见!^-^


标签:int,元素,矩阵,查找,杨氏,key
From: https://blog.51cto.com/u_16191221/7463121

相关文章

  • 透视投影矩阵的生成
    为何最新的OpenGL看不到gluPerspectiveAPI最新版本的OpenGL(OpenGL3.1及更高版本)中取消了对GLU(OpenGLUtilityLibrary)的支持。GLU是一个辅助库,提供了一些便捷的函数和工具函数,用于简化OpenGL编程过程。其中包括gluPerspective函数,用于生成透视投影矩阵。OpenGL的设计哲学......
  • 协方差矩阵
     概念协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。其实简单来讲,协方差就是衡量两个变量相关性的变量。当协方差为正时,两个变量呈正相关关系(同增同减);当协方差为负时,两个变量呈负相关关系(一增一减)。......
  • 矩阵快速幂--模板
    http://acm.bit.edu.cn/mod/programming/view.php?id=670TheLittleArchitectII#include<stdio.h>#include<string.h>//dp方程:f[n]=3*f[n-1]+3*f[n-2]-f[n-3];//矩阵快速幂。。模板//构造矩阵//310//301//-100structnode{ longlonga[3][3];};lon......
  • LeetCode59.螺旋矩阵II
    LeetCode59.螺旋矩阵IIhttps://leetcode.cn/problems/spiral-matrix-ii/学习内容螺旋矩阵题,就是给你一个矩阵的长度n,去返回一个螺旋表示的二维数组。如n=3时,返回的二维数组为:123894765解题的关键点,是考虑边界上的点怎么处理,通过遍历圈数+遍历每个边来输出二维数组。当每次转圈时......
  • 什么是项目管理里的需求跟踪矩阵?
     需求跟踪矩阵(RequirementsTraceabilityMatrix,RTM)是项目管理和质量管理中的一个工具,用于跟踪项目需求与其来源以及如何满足这些需求的文档或活动之间的关系。其主要目的是确保项目满足所有定义的需求,同时为相关方提供一个清晰的视图,显示需求如何在项目的......
  • 【学习笔记】【自学】【模板】矩阵快速幂
    题目描述:给定$n\timesn$的矩阵$A$,求$A^k$。矩阵:一个$m\timesn$的矩阵是一个由$m$行$n$列元素排列成的矩形阵列。即形如$$A=\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&......
  • 矩阵
             ......
  • 矩阵快速幂
    矩阵乘法的定义矩阵A*矩阵B=矩阵C                         性质:满足结合律,分配率,但不满足交换律矩阵乘法的特殊情形矩阵A是一个N*N的矩阵,矩阵F是一个N*1的矩阵,设F1=A*F,发现F1也是一个N*1的矩阵,只有一行......
  • 代码随想录算法训练营第二天| 977.有序数组的平方,209.长度最小的子数列,59.螺旋矩阵Ⅱ
    977.有序数组的平方双指针法因为负数平方后也会变大,所以较大的平方值只可能在靠近两端的位置,越往中间走平方值必定越小。所以,在原数组两端各定义一个指针,慢慢往中间走,然后把平方值按顺序放到新数组里即可。classSolution{public:vector<int>sortedSquares(vector<i......
  • 矩阵树定理
    一个用来求一张图的生成树个数的方法。基础结论在无向图中,定义一个点的度数为\(d_i\),边\((u,v)\)的数量为\(c_{u,v}\)。在有向图中,定义一个点的入度为\(ind_i\),出度为\(outd_i\),边\(u\tov\)的数量为\(t_{u,v}\)。先把结论扔出来:求无向图生成树:记矩阵\(M=(m_{ij})......