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

wangxiaojin發表於2018-08-03

最近面試的時候,總會碰到一道題,剛開始看到題目一臉懵,後來第二次又碰到,好吧,既然躲不過,那我們就坐下來好好理理,先弄明白原理,再去寫程式碼.

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

一 . 什麼叫最大子序列?看的一臉懵逼

例如:[1,-1,2]這個陣列,它的子序列,就是[1],[1,-1][1,-1,2],[-1,2],[2] ('為了看的清晰,小編在這裡用[]包起來'); 看到這裡想必大家都已經明白了子序列的概念,就是不同的組合,最大的子序列就是子序列之和最大的那個排列.

二 . 弄懂了題目,我們現在就著手開始分析原理:

  1. 要找出左右的排序組合
  2. 算出所有的排序組合之和,找到和最大的那項排序.

三 .上程式碼

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

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!

相關文章