455.分发饼干
题目描述: 455.分发饼干.
解法
贪心
class Solution(object):
def findContentChildren(self, g, s):
g.sort()
s.sort()
i = len(g) - 1
j = len(s) - 1
count = 0
while i >= 0 and j >= 0:
if s[j] >= g[i]:
j-=1
count += 1
i-=1
return count
主要思想就是找局部最优解,什么时候才是最优,因为每个人只能拿到一块饼干,那把一块大饼干分给胃口大的人就比分给胃口小的人要合理很多,或者说一个胃口小的人吃大饼干就没有吃小饼干划算。
这两种思路分别对应:
1.优先满足大胃口
2.优先使用小饼干
376. 摆动序列
题目描述: 376. 摆动序列.
解法
贪心
class Solution(object):
def wiggleMaxLength(self, nums):
pre_diff = 0
cur_diff = 0
count = 1
for i in range(len(nums)-1):
cur_diff = nums[i+1] - nums[i]
if (cur_diff > 0 and pre_diff <= 0) or (cur_diff < 0 and pre_diff >= 0):
count += 1
pre_diff = cur_diff
return count
一个节点的前面的差和后面的差是异号的,那这个节点就是一个摆动节点。
首先我们要知道,判断一个节点是否是摆动的,那至少需要3个节点进行判断,即前一节点,当前节点,后一节点,那么我们就要考虑边界情况:即一个节点如何判断,两个节点如何判断。当然可以直接强行设定,一个节点是摆动节点数量就是1,两个节点时摆动节点数量就是2。当然最好通过后面的逻辑进行判断。
那么最简单的判断方法就是前一个差和后一个差是否异号了,但是也存在很多其他情况
比如:上 n平 下,这就属于只有一个摆动节点,那么我们可以使用:如果前一个是大于等于0,后一个是小于0,就可以完成对这种平的位置进行判断,但是这样的方式也有缺点,如果是上 n平 上,就会多出来两个摆动节点,那其实完全可以等到判断出这个节点是波动节点,然后再更新前一个差就好了,如果平,那么前一个差会保持不变(一直是负号),只有遇到向下的时候,才会更新一个新的前一个差。
通过这种方式就可以应对中间有异常情况的节点计算,但是还没有考虑到边界情况,因为遍历的i最多到len(nums)-2,那么如果只有一个节点,那不会发生遍历,如果只有两个节点,那么只能计算一个后一个差,但只有两个节点的话,摆动序列长应该也是2,所以可以设置一个默认的前一个差为0,这样就可以满足计算,遍历到第一个节点的时候就会增加一个波动节点,此时再加上第二个节点,就是总节点数,因为无论怎么遍历,最后一个节点都不可能遍历到,但他一定是一个波动节点,那么可以将count默认设为1,这样也可以同时满足只有一个节点的情况。
53. 最大子序和
题目描述: 53. 最大子序和.
解法
贪心
class Solution(object):
def maxSubArray(self, nums):
max_sum = float('-inf')
cur_sum = 0
for num in nums:
cur_sum += num
if cur_sum > max_sum:
max_sum = cur_sum
if cur_sum < 0:
cur_sum = 0
return max_sum
我们可以从少量的数字来考虑这个问题,如果只有一个数字,是-1的话,那么就不管他,如果数字是正数,那么我们就要他,那扩大到序列来看,如果一个序列的和为负数,那么我们就不要他,如果一个序列的和为正数,我们就还要他。那就可以判断当前的序列,如果当前序列为负数了,就抛弃掉,从下一个开始重新计算序列,如果是正数,那我们就保留,并跟最大的进行对比。
不过还是要考虑一些极端情况,例如都是负数,那么这时候就得设定这个最大值的初始化值是负无穷。