455.分发饼干
对饼干和胃口进行排序
遍历胃口,若当前饼干值<胃口值
,饼干继续往后寻找更大值
否则计数+1,向后遍历饼干值使其满足下一个胃口值
func findContentChildren(g []int, s []int) int {
sort.Ints(g)
sort.Ints(s)
count := 0
for i, j := 0, 0; i < len(g) && j < len(s); i++ {
for j < len(s) && s[j] < g[i] {
j++
}
if j < len(s) {
count++
j++
}
}
return count
}
376.摆动序列
(1)贪心
寻找最长子摆动序列:只需记录波峰+波谷出现的次数。对于序列两端的元素,只有一侧相邻元素小于或大于当前元素也满足要求
若遇到平坡,只需在坡度发生摆动变化时记录
func wiggleMaxLength(nums []int) int {
if len(nums) <= 1 {
return len(nums)
}
count := 1
curDiff := 0
preDiff := curDiff
for i := 1; i < len(nums); i++ {
curDiff = nums[i] - nums[i-1]
if preDiff <= 0 && curDiff > 0 || preDiff >= 0 && curDiff < 0 {
count++
preDiff = curDiff
}
}
return count
}
(2)动态规划
nums[i] < nums[i - 1],由波峰转移过来【波谷】,或者保持原状态【持续向下坡度】;
nums[i] > nums[i - 1],由波谷转移过来【波峰】,或者保持原状态【持续向上坡度】
func wiggleMaxLength(nums []int) int {
if len(nums) <= 1 {
return len(nums)
}
up, down := 1, 1
for i := 1; i < len(nums); i++ {
if nums[i] < nums[i-1] {
down = max(up+1, down)
} else if nums[i] > nums[i-1] {
up = max(down+1, up)
}
}
return max(up, down)
}
53.最大子序和
最大连续子序和
(1)贪心
若以nums[i]结尾
求和小于当前值,取当前值,否则继续求和覆盖当前值。最大值为整个遍历过程中连续求和的最大值
func maxSubArray(nums []int) int {
if len(nums) == 1 {
return nums[0]
}
res := nums[0]
for i := 1; i < len(nums); i++ {
if nums[i]+nums[i-1] > nums[i] {
nums[i] = nums[i-1] + nums[i]
}
res = max(res, nums[i])
}
return res
}
(2)动态规划
以nums[i]结尾
的最大连续子序列和:前一个最大和+ 当前值,或者直接选当前值
然后选取序列中和最大的结果
func maxSubArray(nums []int) int {
dp := make([]int, len(nums))
dp[0] = nums[0]
res := dp[0]
for i := 1; i < len(nums); i++ {
dp[i] = max(dp[i-1]+nums[i], nums[i])
res = max(dp[i], res)
}
return res
}
代码随想录文章详解
理论基础
455.分发饼干
376.摆动序列
53.最大子序和
总结
算法学习对代码理解帮助很大,开心