概述
目标题目:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
输入:
7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:
true
解题思路:
为了尽可能节省时间,首先我们先通过对比将不可能出现目标值的一部分数据排除掉。因为数组内的元素数据是以一定的顺序排列的,同一排左边小于右边,同一列上边小于下边,则可以以下列方法去掉不可能出现目标值的数据:用目标值与第一排的数据进行二分查找并插入,找到目标值应当所在的位置,则目标值右边的矩形内的所有数据都不可能等于目标值:
同样将目标值与第一列相比进行二分查找可排除下边的一定范围内的数据。接着将已经比较过的第一排和第一列也排除(如果在比较过程中发现了目标值则直接输出true),然后将剩下的数据作为一个新的二维数组继续进行上述步骤,直到找到目标值或排除所有数据。
代码:
bool Find(int target, vector<vector<int> > array) {
int bottom=array.size();
int right=array[0].size();
int left=0;
int top=0;
while(bottom-top>1||right-left>1)
{
int l=left,r=right;
while(r-l>1)
{
int mid=(r+l)/2;
if(target<array[top][mid])
r=mid;
else
if(target>array[top][mid])
l=mid;
else
return true;
}
right=r;
int t=top,b=bottom;
while(b-t>1)
{
int mid=(b+t)/2;
if(target<array[mid][left])
b=mid;
else
if(target>array[mid][left])
t=mid;
else
return true;
}
bottom=b;
if(bottom-top<=1&&right-left<=1)
if(target==array[top][left])
return true;
top++;
left++;
if(bottom-top<=1&&right-left<=1)
if(target==array[top][left])
return true;
}
return false;
}
最后
以上就是动人钢笔为你收集整理的二维数组查找解题笔记目标题目:解题思路:代码:的全部内容,希望文章能够帮你解决二维数组查找解题笔记目标题目:解题思路:代码:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复