您的位置:首页 > Web前端

有序二维数组中查找指定元素

2017-03-18 19:41 281 查看
题目:在二维数组中每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入一个二维数组和整数,判断二维数组中是否含有该整数,有的话返回该整数的位置,更深一步,如果含有该整数并输出该整数的个数。

首先需要纠正一个概念,二维数组就是二维指针的概念。二维数组具有自动寻址功能,但是二维指针却不可以。详情参考http://blog.csdn.net/liyongbao1988/article/details/7463481

解决思路:

1.既然是从数组中查找一个数字,那么就完全遍历这个数组即可。通过两层循环来实现。

2.因为该二维数组的有序性,所有可以考虑如何快速的找到这个数字:首先想到的就是从第一行第一列开始进行查找,发现所要查找的整数等于当前值就返回,大于当前值则无法进行下一步的判断,所以可以考虑如何利用有序性这一特点。如果能想到从右上角或者是左下角开始进行查找,就会发现查找的快速途径。

#include <iostream>
using namespace std;

bool findNum(int arr[][4], int num, int len, int width, int& x, int& y);
void main()
{
int x = 0;
int y = 0;
int arr[][4] =
{
{ 1, 2, 8, 9 },
{ 2, 4, 9, 12 },
{ 4, 7, 10 ,13},
{ 6, 8, 11, 15},
{ 8, 10, 13, 16},

};
findNum(arr, 16, 4, 5, x, y);
cout << "x=" << x << endl;
cout << "y=" << y << endl;
}

/*
para:
arr 二维数组
num 要查找的数字
len 二维数组的长度
width 二维数字的宽度
x,y 要查找数字的坐标

return:返回是否查找成功
*/
bool findNum_2(int arr[][4], int num, int len, int width, int& x, int& y)
{
int i = 0;
int j = len - 1;
while (i < width && j > 0)//从右上角开始遍历每一列
{
if (arr[i][j] == num)
{
x = i;
y = j;
return true;
}
else if (arr[i][j] > num)
{
--j;
}
else
{
++i;
}
}
return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐