给定大小k的分类子序列

时间:2018-01-03 23:55:00

标签: algorithm

希望找到给定大小的增长最长的子序列,但以下解决方案(在堆栈溢出时找到)仅在某些情况下有效,但不能满足所有极端情况。

function increasingSubSeq(array, k) {
    if(array.length < k) 
        return;
    var maxCount = 0, count = 0;
    var prev = array[0];
    var m = [];
    for(var i = 0;i < array.length;i++) {
        if(prev <= array[i]) {
            count++; 
            m.push(array[i]);   
            if(m.length === k){
                break;
            }

        } else {
            count = 1;
        }
        if(count > maxCount) 
            maxCount = count;

        prev = array[i];
    }
    return m;
} 

纠正o / p返回

增加SubSeq([3,1,4,2,5,1,6,4,7],4);应该只返回[3,4,5,6] 增加SubSeq([3,1,4,2,5,1,6,4,7],2);应该只返回[3,4]

但是下面的i / p会返回错误的答案

increaseSubSeq([1,5,2,3,4],4)它返回[1,5,3,4]而不是[1,2,3,4]

1 个答案:

答案 0 :(得分:0)

上面的算法是错误的,因为你在列表中插入3是因为你指定了prev = array [i],现在在i = 2,prev = 2并且count变为1,现在当i = 3时,在此你检查3&gt; = 2的情况,现在在这种情况下计数变为3但是你看到这里的捕获,你的m数组插入3并且你的m.length = 3导致条件命中m.length == k和这就是为什么你的病情得到满足。

这是您更新的代码,但同样,它并不保证所有的角落情况

function increasingSubSeq(array, k) {
if(array.length < k) 
    return;
var maxCount = 0, count = 0;
var prev = array[0];
var m = [];
var flag = 0;
for(var i = 0;i < array.length;i++) {
    if(prev <= array[i]) {
        count++; 
        m.push(array[i]);   
        if(maxCount === k){
            flag = 1;
            break;
        }

    } else {
        count = 1;
    }
    if(count > maxCount) 
        maxCount = count;

    prev = array[i];
}
if (flag == 0) {
  return -1;
}
return m;
} 

希望这有帮助!