最近面试的时候,总会碰到一道题,刚开始看到题目一脸懵,后来第二次又碰到,好吧,既然躲不过,那咱就坐下来好好理理,先弄明白原理,再去写代码.
需求:请用js求出[3, -6, 123, -945, -231, 112]中的最大子序列?
一 . 什么叫最大子序列?看的一脸懵逼
例如:[1,-1,2]这个数组,它的子序列,就是[1],[1,-1][1,-1,2],[-1,2],[2] ('为了看的清晰,小编在这里用[]包起来'); 看到这里想必大家都已经明白了子序列的概念,就是不同的组合,最大的子序列就是子序列之和最大的那个排列.
二 . 弄懂了题目,我们现在就着手开始分析原理:
- 要找出左右的排序组合
- 算出所有的排序组合之和,找到和最大的那项排序.
三 .上代码
var ary=[3, -6, 123, -945, -231, 112];
//第一步:求出所有的子序列组合;[[3],[3,-6]....]
var allary=[];//所有的子序列-------------------------
for(var i=0;i<ary.length;i++){
let cur=ary[i];
allary.push([ary[i]]);
for(var j=i+1;j<ary.length;j++){
let item=ary.slice(i,j+1);
allary.push(item);
}
}
//第二步骤:累加求和,求出最大的和
let maxsum=null;
let totalAry=[];//求出所有子序列的和
let index=null;//代表maxsum 在totalAry中对应的索引,也就是子序列中对应和最大的那项子序列
for (var i=0;i<allary.length;i++){
let total=allary[i].reduce((pre,cur)=>{
return pre+cur;
});
totalAry.push(total);
maxsum=maxsum>total?maxsum:total;
//第三步骤:找出 maxsum 在totalAry 中的索引
index= totalAry.findIndex((item)=>{
return item==maxsum
})
}
console.log(allary[index])
复制代码
大致的原理就是这样,在这里小编就不封装了,做程序员的你just so so,这个代码通俗易懂,但是缺少优化,欢迎大家一起来做更深层次版本的答案,让我们一起提升,让咱们的程序之路just so so!