分发饼干:455
这道题目是贪心算法的入门题目,当作经典题目来训练贪心思维吧!主要再看看代码怎么写。
首先,有几个小孩就有多少胃口值,然后就是饼干数组。
为了能够不浪费,我们肯定是希望大饼干去喂胃口值最大的那个小孩。
因为最后统计的是数量,那么可以给两个数组排个序!
g.sort()
s.sort()
排完序之后就可以遍历胃口或者是饼干数组,那么是先遍历饼干呢还是先遍历胃口值呢。觉得先遍历胃口值比较好理解,每次遍历一个胃口值,就去看有没有饼干能够满足他,没有的话,拉到了,有的话,就计数。然后饼干数组向前移动一位。
res=0
start=len(s)-1
for i in range(len(g)-1,-1,-1):
if start>=0 and g[i]<=s[start]:
start=start-1
res=res+1
这里的写法比较独特,,我们用for循环从后往前遍历,注意这样的写法,要学起来!(不过如果改变sort的从小到大的顺序的话,就不用这样写)这里for是遍历的胃口值,从大往小遍历。为了避免双for循环,那就将遍历饼干数组就用start来代替。如果能够为该当前的胃口值,找到最适合的饼干,那就start-1,res+1.也就是给胃口找饼干的过程。
摆动序列:376
这个题就当二次赏析了,二刷了,还不知道该怎么写,为啥呢,一是脑子里面只记得波峰波谷了,当时忘记怎么统计,二是脑子总是被“怎么删除”所困扰。其实看了代码就明白,其实不用删除,如果遇到要删除的,直接不理他,不计数不就好了嘛。
还有就是要考虑特殊情况,比如[2,5]这样的,我们默认右边是有一个峰值,当此时的curDiff>0 and preDiff<=0时,就result+1。这样摆动序列就是2.
借随想录的图用用,我自己就不画了:
其实就是要对单调坡上的值进行“删除”,“删除”就是不理他!
具体看代码:
def wiggleMaxLength(self,nums):
if len(nums)<=1:
return len(nums)
curDiff=0
preDiff=0
result=1
for i in range(len(nums)-1):
curDiff=nums[i+1]-nums[i]
if (curDiff>0 and preDiff<=0) or (curDiff<0 and preDiff>=0):
result=result+1
preDiff=curDiff
return result
定义当前的差值和后续的差值,然后判断符合条件的就可以result+1
然后再把当前的差值赋值给先前的差值。
有点跟链表一样哈哈哈!
最大子序和:53
这个题呢,贪心算法,想通了就比较好写代码了。思路就是呢,如果加上一个值nums[i],让整个和成负数了,那这就是超级大的“拖油瓶”了。又因为题目要求取得连续的值,所以呢,就当前的和就应该从下面的nums数组值开始计算。也就是当前和要清零!
class Solution:
def maxSubArray(self,nums):
max_=float("-inf")
tmp=0
for i in range(len(nums)):
tmp=tmp+nums[i]#先加上,看看是啥结果,下面有条件的判断。
if tmp>max_:#当当前和大于最大值时,也就是加上的nums[i]是有益的
max_=tmp#将当前和赋值给最大值
if tmp<=0:#如果加上nums[i]直接拖垮了这个当前和,又因为要求返回的是连续的和
tmp=0#那么当前和就要清零了。
return max_
要有定一个当前和,一个max来存储最大值!这个思路就很清晰呀!