每检测一个元素时不是同时也看了它是不是到队尾了吗?所以不会扫超过min(m)轮。 另外我在想:divide and conquer是不是只能把quadratic变成log linear,对本身 linear的问题没有帮助啊?
【在 h****n 的大作中提到】 : 恩。不过我觉得复杂度应该是O(N×avg(M))
d*i
10 楼
对啊,这个怎么能用到二分查找呢? 逐个头比较吧,O(N * M)
h*n
11 楼
你的M是指什么呀,我的M是指字符串的长度 avg M是指字符串的平均长度 具体M是多少和你字符串的排列是有关系的 考虑两种极端的情况,假设所有字符串的字符都是同一个字符, 第一种所有字符按照长度从长排到短,那么比较下来的长度就是AVG M 第二种就是所有字符按照长度从短到长排,那么比较下来的长度就是MIN M divide conquer的复杂度可以用主定理来分析的,主要看最终的复杂度看分支数量,子 问题规模和合并操作的开销 T(n)=a(T/b) + O(n^d) T(n)= n^d if d > logb a = n^(logb a) if d < logb a = n^d * lgn if d == logb a
写的一个c++代码。 worst case O(N * M) string longestCommonPrefix(vector &strs) { // Start typing your C/C++ solution below // DO NOT write int main() function if(strs.size() == 0) return ""; int longest = 0; while(longest < strs[0].size()) { for(int i = 1; i { if(longest == strs[i].size() || strs[i][longest] != strs[0][ longest]) return strs[0].substr(0, longest); } ++longest; } return strs[0]; }
j*2
13 楼
咱们的M是一个意思。不管你咋么排,一旦扫到最短串的末梢,就终结了啊?
【在 h****n 的大作中提到】 : 你的M是指什么呀,我的M是指字符串的长度 avg M是指字符串的平均长度 : 具体M是多少和你字符串的排列是有关系的 : 考虑两种极端的情况,假设所有字符串的字符都是同一个字符, : 第一种所有字符按照长度从长排到短,那么比较下来的长度就是AVG M : 第二种就是所有字符按照长度从短到长排,那么比较下来的长度就是MIN M : divide conquer的复杂度可以用主定理来分析的,主要看最终的复杂度看分支数量,子 : 问题规模和合并操作的开销 : T(n)=a(T/b) + O(n^d) : T(n)= n^d if d > logb a : = n^(logb a) if d < logb a