返回大小为k的已排序子序列

时间:2017-10-13 05:58:42

标签: javascript arrays algorithm

我是否需要运行内部循环,以便此函数可以返回k大小增加的数组子序列。我在网上的几篇文章的帮助下做了以下几点。截至目前,它按预期返回最长的子序列。

function findKSizeSubSequence(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]);                
        } else {
            count = 1;
        }
        if(count > maxCount) 
            maxCount = count;

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

但是,如果我只希望它返回k大小增加的子序列。

例如:

findKSizeSubSequence([3,1,4,2,5,1,6,4,7], 4);应仅返回[3,4,5,6] findKSizeSubSequence([3,1,4,2,5,1,6,4,7], 2);应仅返回[3,4]

3 个答案:

答案 0 :(得分:1)

只需在循环中添加一个数组长度。如果长度与k匹配,那么只需从循环中退出。

E.g:

function findKSizeSubSequence(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;
} 

答案 1 :(得分:0)

  

但是,如果我只希望它返回k大小增加的子序列。

最短的回答

替换

return m;

通过

return m.slice(0,k);

通过在push语句之后添加支票

,可以优化一点
    if(prev <= array[i]) {
        count++; 
        m.push(array[i]);                
        if ( m.length == k ) //this condition will stop the loop as soon as `k` elements have been pushed to `m`
        {  
           break;
        }
    }

答案 2 :(得分:0)

如果达到计数,您可以使用早期退出的不同样式。

&#13;
&#13;
function findKSizeSubSequence(array, count) {
    var result = [array[0]];
    array.some(function (a) {
        if (a > result[result.length - 1]) {
            result.push(a);
            return result.length === count;
        }    
    });
    return result;
}

console.log(findKSizeSubSequence([3, 1, 4, 2, 5, 1, 6, 4, 7], 4));
console.log(findKSizeSubSequence([3, 1, 4, 2, 5, 1, 6, 4, 7], 2));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;