代码随想录算法训练营|day31

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.最大子序和

总结

算法学习对代码理解帮助很大,开心

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值