3道题目
455. 分发饼干
376. 摆动序列
53. 最大子数组和
解题理解
455
不管是暴力遍历还是一次遍历,都需要先对两个两个数组排序,然后就是选择有限分配少的还是优先分配多的,但遍历主题需要是饼干,同时在遍历过程中可以用下标表示最多可以分的人数。
class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
g.sort()
s.sort()
index = 0
for i in range(len(s)):
if index < len(g) and s[i] >= g[index]:
//如果遍历主体是g的话,可能会出现s[index]无法往后,不能正常计数
index += 1
return index
376
这题有点像双指针,只不过这里不是指针,而是两个变量,一个存当前差值,另一个存之前的差值。
整体思路都能写出来,就是最后取差值时纠结错了,写成i跟i-1去做差值,把很多情况变得复杂化。
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
if len(nums) <= 1:
return 1
index = 1
dis = 0
pre = 0
for i in range(len(nums) - 1):
dis = nums[i + 1] - nums[i]
if (pre >= 0 and dis < 0) or (pre <= 0 and dis > 0):
index += 1
pre = dis
return index
53
中间用到的一个巧妙思路没想出来,有点偏数学思维了。
连续最大子数组和在遍历过程中,会出现负值加进来的情况,当整体子数组和要成为负数时,就需要置0重新计算,题目不要求输出子数组,只需要和,再搭配一个maxNum时刻保存遇到的最大和,这样每次重新确定开头就可以确保扫描到的子数组和最大。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
res = -10000
num = 0
for i in range(len(nums)):
if num < 0:
num = 0
num += nums[i]
if num > res:
res = num
return res