题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解析:二维数组已经排序,从左向右,从上到下递增。
如果二维数组不为空,从第一行依次向下开始查询,如果行不为空,比较目标值与对应行的首尾节点,如果大于头节点,小于尾节点,就在行中依次查询
class Solution {
public:
bool Find(int target, vector<vector<int> > array)
{
if(array.empty()) return false;
int length=array.size();
for(int i=0;i<length;i++)
{
if(array[i].empty()) continue;
else if(target>=array[i][0])
{
if(target<=array[i][array[i].size()-1])
{
for(int j=(array[i].size())-1;j>=0;j--)
{
if(target==array[i][j]) return true;
else if(target>array[i][j])break;
}
}
else continue;
}
else return false;
}
return false;
}
};
break与continue的用法:
break:
1)结束当前整个循环。忽略循环体中任何其它语句和循环条件测试。
2)只能跳出一层循环,如果你的循环是嵌套循环,那么你需要按照你嵌套的层次,逐步使用break来跳出。
continue:
1)终止本次循环的执行,即跳过当前这次循环中continue语句后尚未执行的语句,接着进行下一次循环条件的判断。
2)终止当前的循环过程,但他并不跳出循环,而是继续往下判断循环条件执行语句。他只能结束循环中的一次过程,但不能终止循环继续进行。
当然啦,除了从第一行查到最后一行,从最后一行查到第一行也是同样的道理,代码如下:
class Solution {
public:
bool Find(int target, vector<vector<int> > array)
{
if(array.empty()) return false;
int length=array.size();
for(int i=length-1;i>=0;i--)
{
if(array[i].empty()) continue;
else if(target>=array[i][0])
{
if(target<=array[i][array[i].size()-1])
{
for(int j=array[i].size()-1;j>=0;j--)
{
if(target==array[i][j]) return true;
else if(target>array[i][j]) break;
}
}
else return false;
}
else continue;
}
return false;
}
};
方法二:从矩阵的右上角开始查找,当目标大于该点元素时,向下运动(行号加 1),当目标小于该点元素时,向左运动(列号减 1),目标等于该点元素,返回 true,当列号小于0,或者行号大于等于总行数,意味着找不到,返回 false。
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int row = array.size();
int col = array[0].size();
int i = 0, j = col-1;
while (i < row && j >= 0) {
if (array[i][j] == target)
return true;
else if (array[i][j] > target)
j = j-1;
else
i = i+1;
}
return false;
}
};