这个java leetcode解决方案在最坏的情况下使用二次时间吗?

时间:2015-08-24 18:56:17

标签: java time-complexity

我在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;   
    }
}

2 个答案:

答案 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)