455.分发饼干
题目链接:https://leetcode.cn/problems/assign-cookies/
var findContentChildren = function(g, s) {
g=g.sort((a,b)=>a-b)
s=s.sort((a,b)=>a-b)
// res用来记录可以喂饱多少孩子
let res=0
let index=s.length-1
for(let i=g.length-1;i>=0;i--){
if(index>=0&&s[index]>=g[i]){
res++
index--
}
}
return res
};
解题思路:
1.贪心算法问题主要是找出局部最优然后推出全局最优即可
2.寻找最大的饼干以满足最大的符合的胃,且让饼干尺寸不过于太大而浪费,寻找最符合接近的即可。
376.摆动序列
题目链接:https://leetcode.cn/problems/wiggle-subsequence/
var wiggleMaxLength = function(nums) {
if(nums.length===1) return nums.length
// 默认前面会延长一点
let prediff=0 //前一个坡度
let curdiff=0 //下一个坡度
// 默认最右端有一个坡度
let result=1
for(let i=0;i<nums.length-1;i++){
curdiff=nums[i+1]-nums[i]
if(prediff>=0&&curdiff<0||prediff<=0&&curdiff>0){
// 记录波动
result++
prediff=curdiff
}
}
return result
};
解题思路:
1.理解题意,分析各种情况
第一种情况:上下坡中有平坡 第二种情况:数组首位两端,假设数组最前面还有一个数组,且prediff=0,prediff为前一个坡度,最后一个数为一个坡度。第三种情况:单调坡度有平坡,我们只需要在这个坡度摆动变化的时候,更新prediff就行,这样prediff在单调区间有平坡的时候就不会发生变化,造成我们代码结果与理想不符。
53.最大子数组和
题目链接:https://leetcode.cn/problems/maximum-subarray/
var maxSubArray = function(nums) {
let result=-Infinity
// 用来记录累加和
let count=0
for(let i=0;i<nums.length;i++){
count+=nums[i]
if(count>result){
result=count
}
if(count<0){
// 将下一个nums[i]作为新的起点,重新开始技术
count=0
}
}
return result
};
解题思路:
1.有一个误区是不要一碰到负数就丢弃,而是如果累加之和为负数加上下一个数让其更小,那么就丢弃,从下一个数开始重新计数即可,通过实现局部最优解,来实现全局最优解。