【发布时间】:2019-04-27 10:51:20
【问题描述】:
我最近在一次采访中被问到这个问题,我想知道如何回答这个问题。
你有一个任意随机顺序二进制数字的二维矩阵
0 0 0 0 0 0 0 01 0 0 1 1 1 1 01 0 0 0 1 1 1 11 0 1 1 0 1 1 01 1 0 0 0 0 1 1
@987654326 @并且你需要找到这种模式的出现
111
所以,看上面的矩阵很明显答案是6。 我就这样解决了
unsigned int Findpairs(const std::vector<std::vector<unsigned int>>& A) {
unsigned int count = 0;
for (unsigned int i = 0; i < (A.size()-1); i++) {
for (unsigned int j = 0; j < (A[i].size()-1); j++){
if(A[i][j]==1 && A[i+1][j]==1 && A[i+1][j+1]==1){
count++;
}
}
}
return (count);
}
下一个问题是获得更好的时间复杂度。 我无法回答确切的解决方案。
有人可以帮我解决这个问题吗?我只是出于自己的好奇心而想知道这一点。
【问题讨论】:
-
首先,问自己两个问题。一、yo9ur算法的时间复杂度是多少?其次,是什么驱动了它?如果你不能回答这些问题,你就无法知道是否可以改进时间复杂度,更不用说如何改进了。
-
对于这个解决方案,我的 T 复杂度为
O(n^2)2 个 for 循环将始终执行。我仍然找不到更好的解决方案。有没有 -
我认为面试官的意图是看你的思考过程。这个问题与在给定字符串(长度 n)中寻找子字符串(长度 m)非常相似,其朴素算法的复杂度为
O(n*m)。在这种情况下,搜索空间是二维的,复杂度是O(n^2 * m)其中m是要搜索的模式的长度(在您的情况下为 3)。或许,面试官希望你按照与 KMP 算法(以及类似的 O(n) 子字符串搜索算法)类似的思路在 2 维中思考。
标签: c++ algorithm time-complexity