在C论坛上逛,发现了这样一个题,挺有意思的, 决定自己编一下。
1.给定如下的n*n的数字矩阵,每行从左到右是严格递增, 每列的数据也是严格递增
1 2 3
3 5 6
4 8 9
现在要求设计一个算法, 给定一个数k 判断出k是否在这个矩阵中。 描述算法并且给出时间复杂度(不考虑载入矩阵的消耗)
这个题显然要用折中寻找发,时间复杂度为(log2n)
1.给定如下的n*n的数字矩阵,每行从左到右是严格递增, 每列的数据也是严格递增
1 2 3
3 5 6
4 8 9
现在要求设计一个算法, 给定一个数k 判断出k是否在这个矩阵中。 描述算法并且给出时间复杂度(不考虑载入矩阵的消耗)
这个题显然要用折中寻找发,时间复杂度为(log2n)
#include <iostream>
using namespace std;
bool FindItem( int[][] M, int value, int RowStart, int RowEnd, int ColStart, int ColEnd )
{
if( RowEnd <= RowStart || ColEnd <= ColStart )
{
return false ;
}
int RowMid = (RowStart + RowEnd)/2 ;
int ColMid = (ColStart + ColEnd)/2 ;
int MidValue = M[RowMid][ColMid];
if( value == MidValue )
{
return true ;
}
else if( value > MidValue )
{
return FindItem( M, value, RowMid + 1, RowEnd, ColStart, ColMid - 1 ) // bottom left
|| FindItem( M, value, RowMid, RowEnd, ColMid, ColEnd) // bottom right
|| FindItem( M, value, RowStart, RowMid - 1, ColStart + 1, ColEnd); // top right
}
else
{
return FindItem( M, value, RowMid + 1, RowEnd, ColStart, ColMid - 1 ) // bottom left
|| FindItem( M, value, RowStart, RowMid, ColStart, ColMid) // top left
|| FindItem( M, value, RowStart, RowMid - 1, ColStart + 1, ColEnd); // top right
}
}