在一个二维数组中,每一行都从左到右递增,每一列都从上到下递增,在这样一个数组里查找一个数

第一种:

思路:

二维数组是从左到右递增,从上到下递增,row为行数,col为列数,a[row-1][col-1]为最大数,如果剔除这一行,这一列,则最大数为a[row-2][col-2],如果要查找的num大于a[row-2][col-2]并且大于a[row-1][col-1],则在该row-1行和col-1列查找,照这样遍历。


这样太麻烦,效率太低,应当舍弃。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>//二维数组传参
bool find(int (*a)[7],int M,int num)
{
assert(a);
int i=M-1;
int j=6;
if(num<a[0][0]||num>a[i][6])
{
return false;
}
else
{
while((j>0)&&(i>0))
{
if(num==a[i][j])
{
return false;
}
               if(num<a[i][j]&&num<a[i-1][j-1])
  {

  int tmp=0;
  for(;tmp<j;j++)
  {
                      if(a[i][tmp]==num)
 {
 return true;
 }
  }
  tmp=0;
  for(;tmp<i;tmp++)
  {
  if(a[tmp][j]==num)
  {
  return true;
  }
  }
  return false;
  }
  else 
  {
  j--;
  i--;
  }
}
if(i==0)
{
for(int tmp=0;tmp<j;tmp++)
{
if(a[i][tmp]==num)
{
return true;
}
}
return false;
}
if(j=0)
{
for(int tmp=0;tmp<i;tmp++)
{
if(a[tmp][i]==num)
{
return true;
}
}
return false;
}
}

}
int main()
{
int a[4][7]={
{1,2,3,4,5,6,7},
{3,4,5,6,7,8,9},
{5,7,9,11,13,15,17},
{7,9,13,15,17,21,23},
};
printf("%d\n",find(a,4,1));
system("pause");
return 0;
}

第二种:

思路:实现比较简单,建议采用。

从右上角访问,该数组从左到右递增,从上到下递增,a[0][col-1]和num比较,如果num比a[0][col-1]大,则剔除该行,row--,如果num比a[0][col]小,则剔除该列,col--;缩小查找范围。


左下角访问道理一样。

#include<stdio.h>
#include<stdlib.h>
bool find(int (*a)[7],int row,int num)
{
	int i=0;
	int col=7;
	int j=col-1;
	while(i<row&&j>=0)
	{
		if(a[i][j]==num)
		{
			return true;
		}
		else if(a[i][j]<num)
		{
			i++;
		}
		else 
		{
			j--;
		}
	}
	return false;
}
int main()
{
	int a[4][7]={
	{1,2,3,4,5,6,7},
	{3,4,5,6,7,8,9},
	{5,7,9,11,13,15,17},
	{7,10,13,15,17,21,23},
	};
	printf("%d\n",find(a,4,34));
	system("pause");
	return 0;
}


本文出自 “liveyoung” 博客,转载请与作者联系!

算法思路: 因为数组的每一行和每一列都是递增的,所以我们可以从数组的右上角开始查找,如果目标比当前位置的大,就往下移动一行;如果目标比当前位置的小,就往左移动一列;如果相等,直接返回 true;如果超出了数组的边界,则说明数组不含有该整,返回 false。 时间复杂度:$O(m+n)$,其 $m$ 是数组的行,$n$ 是数组的列。 代码实现: C++ 代码: ```cpp bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { if (matrix.empty()) return false; int m = matrix.size(), n = matrix[0].size(); int i = 0, j = n - 1; while (i < m && j >= 0) { if (matrix[i][j] == target) { return true; } else if (matrix[i][j] < target) { i++; } else { j--; } } return false; } ``` Java 代码: ```java public boolean findNumberIn2DArray(int[][] matrix, int target) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return false; } int m = matrix.length, n = matrix[0].length; int i = 0, j = n - 1; while (i < m && j >= 0) { if (matrix[i][j] == target) { return true; } else if (matrix[i][j] < target) { i++; } else { j--; } } return false; } ``` Python 代码: ```python def findNumberIn2DArray(matrix: List[List[int]], target: int) -> bool: if not matrix: return False m, n = len(matrix), len(matrix[0]) i, j = 0, n - 1 while i < m and j >= 0: if matrix[i][j] == target: return True elif matrix[i][j] < target: i += 1 else: j -= 1 return False ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值