行元素从小到大递增,列元素从小到大递增的数组查找算法

php中文网
发布: 2016-08-08 09:22:04
原创
1412人浏览过

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

考点:这道题主要是要利用好所给的两个条件,行递增和列递增,将肯定不合适的数据排除在外,将要遍历的数据尽可能的减少。

数组例子如下:

1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15

解决一个复杂的问题时,最有效的办法就是从具体的问题入手分析。

通过观察可知,

1.列最开头如果大于要查找的数,那么要查找的数不可能在那一列,可以直接剪枝掉那一列;

结果如下:

牛小影
牛小影

牛小影 - 专业的AI视频画质增强器

牛小影 57
查看详情 牛小影
1 2
2 4
4 7
6 8

2.通过剪枝列之后,可以发现,行最末尾的数如果小于要查找的数,那么要查找的数肯定也不在那一行;

结果如下:

4 7
6 8

3.这样数据就剪成最少的可能的数量,然后再对这些数据进行遍历查找,就可以了。

代码如下:

<?php
/*
$data  数组
$number 查找的数
$rows 数组的行数
$columns 数组的列数
*/
function inArray($data,$number,$rows,$columns)
{
	$row=0;
	$column=$columns-1;
	$first=true;
	while($row<$rows&&$column>=0)
	{
		if($data[$row][$column]>$number&&$first)
		{
			$column--;
			//echo $column.',';
		}
		if($data[$row][$column]<$number)
		{
			$first=false;
			$row++;
			//echo $row.',';
			//如果查找的数大于数组中的所有元素,那么就遍历完所有的行后退出
			//continue是防止这种情况的出现,会和第四个条件冲突
			continue;
		}
		if($data[$row][$column]==$number)
		{
			return true;
		}
		if($data[$row][$column]>$number&&!$first)
		{
			break;
		}
	}

	for($i=$row;$i<$rows;$i++)
	{
		for($j=0;$j<$column;$j++)
		{
			if($data[$i][$j]==$number)
			{
				return true;
			}
		}
	}
	return false;
}

$a=array(array(1,2,8,9),array(2,4,9,12),array(4,7,10,13),array(6,8,11,15));
var_dump(inArray($a,7,4,4));
var_dump(inArray($a,101,4,4));
登录后复制

版权声明:本文为博主原创文章,未经博主允许不得转载。

以上就介绍了行元素从小到大递增,列元素从小到大递增的数组查找算法,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号