如何解出数组中最大的子序列?花一分即可了解原理,just so so

312 阅读2分钟

最近面试的时候,总会碰到一道题,刚开始看到题目一脸懵,后来第二次又碰到,好吧,既然躲不过,那咱就坐下来好好理理,先弄明白原理,再去写代码.

需求:请用js求出[3, -6, 123, -945, -231, 112]中的最大子序列?

一 . 什么叫最大子序列?看的一脸懵逼

例如:[1,-1,2]这个数组,它的子序列,就是[1],[1,-1][1,-1,2],[-1,2],[2] ('为了看的清晰,小编在这里用[]包起来'); 看到这里想必大家都已经明白了子序列的概念,就是不同的组合,最大的子序列就是子序列之和最大的那个排列.

二 . 弄懂了题目,我们现在就着手开始分析原理:

  1. 要找出左右的排序组合
  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!