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]));

后记:
        虽然题目简单,但是蕴藏深刻的人生哲理的样子 [滑稽逃]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值