Leetcode - 455
先对两个序列进行排序,用两个指针,一个指向孩子序列的开头,一个指向饼干序列的开头,开始循环,若饼干指针指向的元素大于孩子指针指向的元素,res+=1,两指针各向前一步,若不满足,则饼干指针向前,直到其中一个指针指向末尾就结束循环
def findContentChildren(self, g: List[int], s: List[int]) -> int:
g.sort()
s.sort()
i = 0
j = 0
res = 0
while i < len(g) and j < len(s):
if s[j] >= g[i]:
res +=1
i+=1
j+=1
else:
j+=1
return res
Leetcode - 376
此题是通过记录峰值来跟新结果的,一个两个元素的严格单调序列(nums[i] > nums[i-1] or nums[i] < nums[i-1])它的峰值是两个,但如果是三个元素的单调序列,那它的峰值仍然是两个,只有当第三个元素和第二个元素的大小关系 与 第二个元素和第一个元素的大小关系相反时,峰值才会+1。
峰值初始值为1,因为列表中至少一个元素,只要第二个元素大于或小于第一个元素,峰值就会+1,再往后,只有当三个元素间,呈现+ - 或 - +关系时,峰值才+1
一种在最左侧的特殊情况是,第一个元素与第二个元素相等,但是第三个元素与第二个元素不等,这里峰值仍然有两个,分别是第二和第三个元素。
在进行循环的过程中,我们的i指代的是三个元素的中间那个,当前元素和前一个元素的差值为preGap, 后一个元素和当前元素的差值为currGap, 循环到len(nums)-1时结束
满足峰值➕1的条件是 (preGap <=0 and currGap >0) or (preGap >=0 and currGap <0)
且仅仅当满足条件时,我们才将preGap跟新为currGap,因为在处于连续单调区间时,跟新preGap没有什么意义
def wiggleMaxLength(self, nums: List[int]) -> int:
if len(nums) == 1:
return 1
preGap = 0
currGap = 0
res = 1
for i in range(len(nums)-1):
currGap = nums[i+1] - nums[i]
if (preGap <=0 and currGap >0) or (preGap >=0 and currGap <0):
res +=1
preGap = currGap
return res
Leetcode - 53
设置一个无限小的值作为结果res的初始值,再设定一个变量temp用于记录当前子序列和,
开始遍历序列后,temp += nums[i],然后更新res,res为自身和temp的最大值,
接着 如果此时temp <0 了, 我们直接将temp置为0,然后continue,代表子数组从下一个元素开始重新记录,这也是贪心所在,一旦小于0了,代表遇到了负数,就从下一个元素开始重新记录
def maxSubArray(self, nums: List[int]) -> int:
if len(nums) == 1:
return nums[0]
res = -float("INF")
temp = 0
for i in range(len(nums)):
temp += nums[i]
res = max(res,temp)
if temp <0:
temp = 0
return res