携手创作,共同成长!这是我参与「掘金日新计划 · 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