假设一个矩阵,横纵行都处于递增趋势,如何高效找出其中的关键字key?
如图,倘若我们想找出其中的15,最简单的方法便是历遍整个矩阵,但这需要至少15次查找,显然不够高效。
这里提供另一种思路。
创建二维数组arr[i][j];i表示行,j表示列。
由于矩阵的递增特性,我们可以直接从矩阵的最右上角开始寻找,若这个数字小于key,那么可以确定,这个数字肯定不在此行,便让i++,以此类推。若这个数字小于key,那么可以确定,此key肯定在这一行,只需历遍此行即可。
根据这个思路,我们找到15仅需3步,效率大大提升,下面提供代码实现:
这里有几点需要注意:
1.行j的赋值应当是l - 1,而不是l,否则可能会导致栈溢出。
2.关于“没找到”情况的书写,可能会出现这样的错误:
else if (arr[i][j] == k)
{
printf("arr[%d][%d]\n", i, j);
break;
}
else
{
printf("没找到\n");
} } }
但这种情况在数学上不会存在,因此,当我们找到了key后,直接返回函数,随后在循环之外书写即可。