希望找到给定大小的增长最长的子序列,但以下解决方案(在堆栈溢出时找到)仅在某些情况下有效,但不能满足所有极端情况。
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]
答案 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;
}
希望这有帮助!