算法题2
来源:互联网 发布:淘宝手机详情图片尺寸 编辑:程序博客网 时间:2024/05/22 14:19
该算法的复杂度为O(n log n)
2.输入是一个N×N的数字矩阵并且已经读入内存。每一行均从左到右增加。每一列则从上到下增加。给出一个O(N)最坏情形算法以确定数X是否在矩阵中。
k是被寻找的数, i,x是横坐标,j,y是纵坐标。
1. 如果k> m[i][j]=> 对于所有的元素m[x][y]此时 x> =i, y> =j
2. 如果k=m[i][j]找到
3. 如果k <m[i][j]=> k大于 所有的元素 m[x][y] 此时 x <=i, y <=j
因此只需要构造一种搜索的方法(用图形比较好理解,不过这儿没法贴图):
1. 首先从i=0, j=0开始搜索j,得到最右端的第一个大于k的j,这儿记为jMax。此时可以推出:如果k存在,那么k所在的元素m[x][y]必定有x> =i, y <=jMax-1,也就是说必定在(i,jMax)的左下方。
2. 然后从i=0,j=jMax-1开始:
3. 如果k> m[i][j],则++i 因为此时 x <=i y <=j的元素均小于k,所以可以往下走
4. 如果k <m[i][j],则--j 因此此时x> =i y> =j的元素均大于k,所以只能往左走,往上走不行,因为上面的数肯定都是大于或者小于k的
5. 第3,4步不断重复直到找不到或者找到为止
时间复杂度O(2N)
程序代码如下:
bool search(int *array, int l, int r, int num)
{
int i=0;
int j=0;
for(;j<r;++j)
{
if(array[i*r + j]>num)
break;
else if(array[i*r + j] == num)
return true;
}
--j;
while(1)
{
if(array[i*r + j]>num) //左走
j--;
else if(array[i*r + j] < num) )//下走
i++;
else
return true;
if(i>=l || j<0) //找不到
return false;
}
return false;
}
调用的search(&m[0][0],N,N,num)
对于二维数组:
(1)两个维数都不给出,把两个维数都作为形参:
void func(double a[][], int dim1,int dim2);
(2)直接将数组名作为指向指针的指针:
void func(double **a, int dim1,int dim2);
定义二维动态数组来避免上面的问题
这都是错误的。因为,参数声明a[][]本身就是非法的。因为,为了确定元素的位置,多维数组的第二个以后的维都必须知道。一种正确的解决方法是:
void print(int *a, int dim1, int dim2)
{
for(int i=0; i<dim1; i++){
for(int j=0; j<dim2; j++)
cout<<a[i*dim2+j]<<'/t';
cout<<'/n';
}
}
函数调用时的第一个参数是第一个元素的地址
当然可以采用
- 面试算法题2
- 算法题2
- 算法题2
- 递归算法题2
- [算法]常见算法题
- 算法题/排序算法
- 算法2:贪心算法
- IT面试算法题(2)
- 算法题---字符串篇2
- 算法题1+2+...+N
- 算法题2:替换空格
- 算法题
- 算法题
- 算法题
- 算法题
- 算法题
- 算法题
- 算法题
- SQL Server 2008 CTP支持PowerShell
- 读文档也是一门艺术
- MIO神达A700/A701ROM刷机教程
- 只禁止多个进程运行
- 如何开启 Windows 2000 Server 的远程桌面
- 算法题2
- 在ModalDialog中操作父窗口对象
- 延缓写入失败
- 汇编->十进制到十六进制数转换的程序实现
- P67 2-17
- 木马程序
- Portal日志开发
- Struts标签库
- 第一次面试动画