最近要开始刷数据结构与算法题,曾经被今日头条笔试代码和面试手写代码虐哭,就不能友好地手写一些排序这样简单的算法吗
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
最最naïve的做法就是每行做二分查找了,然后还可以对列先做一个二分查找来删除一些行,但显然这样的复杂度还是很高的,想想这个没有利用什么特性。那对于给定的二维数组,在二分的时候没有把行递增和列递增一起考虑,这样题目给这个二维数组就显得没那么大意义了。那为了在一次操作中同时利用行递增和列递增,其实最简单的就是比较操作啦。
然后想一想就能发现每次只要比较最右上角的元素,如果大于该元素,就可以删掉一行,小于该元素,就可以删掉一列。这样的时间复杂度就是O(m+n)的,手写代码如下:
bool find(int a[][], int m, int n, int target)
{
bool found = false;
int tmpm = 0;
while(tmpm < m && n > 0)
{
if(target = a[tmpm][n-1])
{
found = true;
break;
}
else if(target > a[tmpm][n-1])
tmpm++;
else
n--;
}
return found;
}
手写过程7分钟左右,中间有一定涂改。这个类型的面试题的话就还算好,我比较怕数据结构。
昨天听毛不易的歌的时候看到一句话—-初闻不知曲中意,再听已是曲中人。自己遐想吧