我在leetcode网站上做运动。我尝试了这个解决方案的最长子串没有重复字符问题。判断系统接受答案并返回良好的运行时间。当我试图分析时间复杂度时,我发现输入字符串是唯一的时间是二次时间。循环内部每次执行i-1次,这意味着它将执行(n-1)+(n-2) )+ ..... + 1 =(n-1)n / 2次。我对吗?
public class Solution {
public int lengthOfLongestSubstring(String s) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if(s == null) return 0;
char[] str = s.toCharArray();
if(str.length == 0) return 0;
int max = 1;
int barrier = 0;
for(int i = 1; i < str.length; i++){
for(int j = i - 1; j >= barrier;j--){
if(str[i] == str[j]){
barrier = j + 1;
break;
}
}
max = Math.max(max, i - barrier + 1);
}
return max;
}
}
答案 0 :(得分:0)
对我而言似乎并不完全是二次方的,因为int j = i - 1
。所以在开始时j明显比i短。但最后J变成了我,你得到了一个二次时间,但不是整个字符串。只是为了最后一部分。
答案 1 :(得分:0)
是的,你是对的,它是二次的。如果每个字符都是唯一的,则条件将始终为false,屏障将保持为0.这将为您提供最坏情况。如果忽略常量时间语句,并将屏障替换为0,则最终得到:
for(int i = 1; i < n; i++) {
for(int j = i - 1; j >= 0; j--) {
// ....
}
}
这里的迭代次数是:
0 + 1 + 2 + ... + (n - 1) = ((n - 1) * n) / 2 = (n^2 - n) / 2 = O(n^2)