题:在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字6,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。
这种行和列分别递增的矩阵,叫“杨氏矩阵”,而在这个矩阵中的查找称为:杨氏矩阵查找。
1、分治法,分为四个矩形,配以二分查找,如果要找的数是6介于对角线上相邻的两个数4、10,可以排除掉左上和右下的两个矩形,而递归在左下和右上的两个矩形继续找,如下图所示:
2、定位法,时间复杂度O(m+n)。首先直接定位到最右上角的元素,再配以二分查找,比要找的数(6)大就往左走,比要找的数(6)小就往下走,直到找到要找的数字(6)为止,如下图所示:
//杨氏矩阵查找
//定位法(完整代码)
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
using namespace std;
#define ROW 4
#define COL 4
bool YoungMatrix(int a[][COL], int Value)
{
int i = 0, j = COL-1;
while (i < ROW && j >= 0)
{
if (a[i][j] > Value)//比要找的数大,就往左走
{
j--;
}
else if (a[i][j] < Value)//比要找的数小,就往右走
{
i++;
}
else
{
return true;
}
}
return false;
}
int main()
{
int array[ROW][COL] = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } };
int KeyValue = 10;
bool TF = YoungMatrix(array, KeyValue);
if (TF == true)
{
cout << "TRUE,该值存在!" << endl;
}
else
{
cout << "FALSE,该值不存在!" << endl;
}
return 0;
}
//定位法(网上参考代码)
bool YoungMatrix(int a[][COL], int Value)
{
int i = 0, j = COL-1;
int var = a[i][j];
while (true)
{
if (var==Value)
{
return true;
}
else if (var < Value&& i<ROW-1)
{
var=a[i++][j];
}
else if(var > Value&& j>0)
{
var=a[i][--j];
}
else
{
return false;
}
}
}