LeetCode WIith JS || 53. Maximum Subarray[尋求最大連續序列]

題目描述:

        Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

        For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
        the contiguous subarray [4,-1,2,1] has the largest sum = 6.

大白話:

        一個數組裏面數據有正有負,求連續的幾個數加起來是數組中能找到的最大的和。返回最大和;

        原題目鏈接: 53. Maximum Subarray

思路:

        以數組[-2,1,-3,4,2,1,-5,4]來模擬下“計算機”的思考方式[有邏輯性的,非一眼看出的那種思維方式]。
        首先從-2開始往右走,-2+1=-1>-2,因此1收入囊中,而此時是否應該繼續下去判斷第三位了呢,我們看下前兩位的取捨是否是最優解。-2,1很明顯最優解是隻選擇1,加了-2之後還使得1的身價下跌得不償失。接下來看第三位-3,1-3=-2<1,那麼我們是否就應該放棄-3連同放棄1從第4位開始了呢,no。我們不能爲了眼前的一點小泥濘就放棄第3位之後的未知的大片森林,這和我們之前選擇接納1而放棄-2是不一樣的,-2.1是我們當前擁有的已知道的資源,在現有資源裏尋求最佳解是明哲保身的做法。好了這段講的太哲學了些。

        歸納下:當我們從左邊往右篩選時,只有噹噹前元素大於現有累加和[已知資源]時,如[-2,1]中1>-2+1,我們就拋棄現有的資源,直接讓當前元素登基上位;除此以外的任何情況我們都不能拋棄當前元素,因爲當前元素背後都有無法預知的寶藏。當然也不能輕易拋棄之前的元素,除非你確定你拋棄最佳選擇,不然會面臨撿了西瓜丟了芝麻的囧尬局面。

        這個題,讓我想到了柏拉圖麥穗的故事,蘇格拉底帶徒弟們來到一片麥田,讓他們在麥田行進過程中,每人選擇一支最大的麥穗,不能走回頭路,且只能摘一支。很多人因爲不確定哪顆最大等走到盡頭時反而什麼也沒摘得。
        其實同樣的道理,我們只需要保證當前摘得的比上一個大就好辣~@_@~

        好了代碼實現如下:

AC代碼

var maxSubArray = function(nums) {
    if(nums.length==0) return 0;
    var maxSum = nums[0],curSum = nums[0];
    for(var i=1;i<nums.length;i++){
        if(nums[i]>curSum+nums[i]){
            curSum = nums[i]; 
        }else{
            curSum += nums[i];
        }
        if(curSum>maxSum){
            maxSum = curSum;
        }
    }
    return maxSum;
};
console.log(maxSubArray([-2,1,-3,4,-1,2,1,-5,4]));

後記:
        雖然題目簡單,但是蘊藏深刻的人生哲理的樣子 [滑稽逃]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章