LIS 的运行时复杂性和正确性

Runtime complexity & correctedness of LIS

function LIS(str1){

return LISUtil(str1, 0);

function LISUtil(str1, index){
    if(index == str1.length){
        return 0;
    }
    var min = str1[index],
        len = 1;

    for(let i=index+1; i<str1.length; i++){

        if(min < str1[i]){
            len++;
            min = str1[i];
        }
    }
    return Math.max(len, LISUtil(str1, index+1));
}

}

这是我得出的最长递增子序列(是的,它看起来很奇怪,但请暂时忽略它!)。

我读到 LIS 的运行时间复杂度为 2^n。使用 DP,您可以达到 n^2.

当我思考并尝试我的 LIS 函数时,我确信它在 n^2 中 运行s。它经过 n,每个索引检查 O(n) 次 -> n^2.

我有 运行 一些测试用例,它 return 正确。但是我没有用过 DP...意思是它必须是这两个中的任何一个。

  1. 我的函数有问题。它没有获得 LIS。
  2. 运行 时间是 2^n,我只是没能正确计算 运行 时间。

谁能帮我理清思路? 是不是我的函数有问题,是运行time 2^n,还是不用DP也能得到LIS?

它没有得到LIS。例如,

LIS([1, 6, 2, 3, 7, 4, 5])

returns3.应该是4.