连续子数组的最大和+爬楼梯

79 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

题目:连续子数组的最大和

连续子数组的最大和。输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

示例:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

分析:

要求时间复杂度是n,那是从头到尾只遍历一次吗?

看到示例时不难发现,当前一个数字为负数时,继续下一步做加法是有些徒劳的,因为一个数字加上负数的值会变更小,与初衷想要寻找和最大的目标越来越远。于是暗下决心,相加时如果前面刚加完的数为负数,那就不要它了。

案例:

nums = [-2,1,-3,4,-1,2,1,-5,4] 设总sum=0。一个指针从num[0]开始向后移动。

1.指针指向-2时,与sum相加得sum=-2(负数);

2.指针指向1时,舍去sum=-2,令sum=1;

3.指针指向-3时,与sum相加得sum=-2(负数);

4.指针指向4时,舍去sum=-2,令sum=4;

5.指针指向-1时,与sum相加得sum=3;

6.指针指向2时,与sum相加得sum=5;

...............................................

以此类推。

/** * @param {number[]} nums 
   * @return {number} */ 
var maxSubArray = function(nums) {
let res=0,cur=0
while(cur<nums.length-1){
   var sum = 0;
    if(sum>=0){
    sum+=nums[cur];
    }
    else{
    sum=nums[cur];
    }
    res=Math.max(res,Math.max(sum,cur));
    cur++;
}
return res;
};


题目2:爬楼梯

前言:刚刚看见一个帖子的解法,让我目瞪口呆(其实是让我觉得我是呆子)

正文:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

他的解法:

枚举之后发现结果是1、2、3、5、8、13......观察这个数列,找规律,这道题是个斐波那契数列呵呵只有我这个笨b才知道吗?

也就是这道题的结果有固定公式:

每一项等于前两项的和:

f(x)=f(x-1)+f(x-2),就解决了。。。

但是要楼梯数大于等于3才可以奥,不然x-1,x-2为小于零的数字就不好说了。

思路:n阶楼梯设共有f(n)种跳法

在跳到最后一阶楼梯之前只有两种跳法:跳1阶或2阶。

那就可以设在跳最后一步之前的总共方法为f(n-1)或f(n-2)

所以fn=f(n-1)+f(n-2)

代码实现:

var numWays = function(n) {
    if(n==0) return 1
    if(n==1) return 1
    if(n==2) return 2
    if(n>=3) {
        var p=1,q=1,r=2;
    for(let i=3;i<=n;i++){
        p=q
        q=r
        r=(p+q)%1000000007 
    }
    return r
     }
};

这啥啊,为啥




不能
在代码块以外的  

区域
写字了

okfine,上班摸鱼真开心,今天一点任务也没有诶,想干什么就干什么
真快乐,昨天把小项目给测试之后
就没得事情干了
真呀真高兴
小熊一体锅锅 day8