在一个满足杨氏矩阵的数组中查找一个数字是否存在

本文探讨如何在一个满足杨氏矩阵条件的二维数组中,以线性搜索法寻找特定数字,同时满足时间复杂度小于O(N)。通过从右上角开始搜索,依据比较结果决定向下或向左移动,实现高效查找。
摘要由CSDN通过智能技术生成

题目:
有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。
要求时间复杂度小于O(N);
数组为:
1 3 4
2 4 5
4 5 6
思路:
1、二分搜索法:
说到数组每行或每列都是递增的,我们会想到采用二分查找的办法,但是若矩阵很大,一行需要使用一次二分查找,n行就需要查找n次了,这样的查找效率很低,也不满足题目时间复杂度小于O(N)的要求。
2、另一种办法
二分搜索行不通,就想到了另一种办法,能不能在第一行搜索,然后根据被搜索数字所在范围确定某两列,再进行查找,但这个方法行不通,是有问题的。例如,我们要在以下矩阵中找到数字13.可以发现13在11到15之间,但是第3、4列却并没有13这个数字,而是在第二列中,因此我们可以发现这个办法不太靠谱。
在这里插入图片描述
3、线性搜索
在杨氏矩阵中满足Array [i][j] ≤ Array[i][j + 1],Array [i][j] ≤ Array [i + 1][j],那我们可以从右上角的位置开始搜索,若被查找数字小于该位置数字,就往前查找,我们可以排除掉最后一列,若大于该位置数字则往下查找,同时我们也就可以排除掉第一行了。直到找到,或者到最后一行/列都没有找到,返回最后的结果。
在这里插入图片描述
4、分解的办法
也可以将一个大的矩阵分为四个小的子矩阵,这样可以使问题简化。大家可以自己再研究一下。
本题中,因为矩阵只有3*3,这里我采用第三个线性搜索的办法来实现。
实现代码:

#include<stdio.h>
#include<stdlib.h>
int Search(int arr[][3], int row, int col, int to_find) {
 int i = 0;
 int j = col - 1;
 while (i<row&&j >= 0) {
  if (to_find == arr[i][j]) {
   return 1;
  }
  else if (to_find > arr[i][j]) {
   ++i;
  }
  else if (to_find < arr[i][j]) {
   --j;
  }
 }
 return 0;
}
int main() {
 int arr[3][3] = { 1,3,4,2,4,5,4,5,6 };
 int to_find = 6;
 if (Search(arr, 3, 3, 6)) {
  printf("找到了!\n");
 }
 else
  printf("没找到!\n");
 system("pause");
 return 0;
}

运行结果:
在数组arr[3][3] = { 1,3,4,2,4,5,4,5,6 }中查找数字6.
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值