贪心算法
**案例1 分糖果(leetcode455) **
题目:已知一些孩子和一些糖果,每个孩子有需求因子g,每个糖果有大小s,当某个糖果的大小s>=某个孩子的需求因子g时,代表该糖果可以满足该孩子,求使用这些糖果,最多能满足多少孩子(注意,某个孩子最多只能用1个糖果满足)
class Solution:
def findContentChild(self,g,s):
g = sorted(g) # [5, 7, 9, 9, 10, 15]
s = sorted(s) # [1, 3, 6, 8, 9]
child = 0
cookie = 0
i = 0
while child < len(g) and cookie < len(s):
i += 1
print(f"i={i}")
if g[child] <= s[cookie]:
child +=1
cookie+=1
print(f"child={child}")
print(f"cookie={cookie}")
return child
if __name__ =="__main__":
# g = [5,10,2,9,15,9]
# s = [6,1,20,3,8]
g = [5,10,7,9,15,9]
s = [6,1,9,3,8]
S = Solution()
result = S.findContentChild(g,s)
print(result)
2、摇摆序列
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。
例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。
给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。
问题分析
通过数组给定若干个数字,最后程序返回的是最长摇摆子序列。我们首先要搞清楚的是这个摇摆子序列是怎么定义的,题目描述中清晰的告诉我们是通过从原始序列中删除一些(或者不删除)元素的方式获取子序列。那么现在的问题的关键就是使用什么方法判断这个序列是不是摇摆子序列,如果不是的话我们该如何删除,删除哪些元素才能是当前子序列是摇摆子序列。摇摆子序列如果反映在数轴上的话形成的是折线图。但是在这线图中有一些连续上升或者连续下降的节点,我们需要把这些节点删除之后才能摇摆序列。
问题参考:https://www.cnblogs.com/BaoZiY/p/10861398.html
class Solution:
def maxlength(self, nums):
if len(nums) < 2:
return len(nums)
BEGIN = 0
UP = 1
DOWN = 2
STATE = BEGIN
max_length = 1
vision = [UP, BEGIN, DOWN]
for i in range(1, len(nums)):
if STATE == 0:
if nums[i - 1] < nums[i]:
STATE = 1
max_length += 1
elif nums[i - 1] > nums[i]:
STATE = 2
max_length += 1
if STATE == 1:
if nums[i - 1] > nums[i]:
STATE = 2
max_length += 1
if STATE == 2:
if nums[i - 1] < nums[i]:
STATE = 1
max_length += 1
return max_length
if __name__ == "__main__":
S = Solution()
g = [1, 17, 5, 10, 13, 15, 10, 5, 16, 8]
result = S.maxlength(g)
print(result)

浙公网安备 33010602011771号