Python贪心算法Greedy Algorithm解决案例小结
作者:ShowMeCoding
这篇文章主要为大家介绍了Python贪心算法Greedy Algorithm解决案例小结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
贪心算法
在每一次做决策时,保证当下的决策是最优的,从而使得最后的结果是最优的。
分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
# 最好的选择是不要浪费饼干 class Solution: def findContentChildren(self, g: List[int], s: List[int]) -> int: # 先对胃口值和饼干尺寸排序 g.sort() s.sort() g_l = len(g) g_index = 0 s_l = len(s) s_index = 0 # 计数 count = 0 # 终止条件:孩子数 和 饼干数是否在条件内 while g_index < g_l and s_index < s_l: # 胃口小于饼干 if g[g_index] <= s[s_index]: # 饼干被消耗 count += 1 g_index += 1 s_index += 1 # 胃口大于饼干 else: # 寻求更多的饼干满足胃口 s_index += 1 return count
无重叠区间
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
class Solution: def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int: # 判断是否为空 if not intervals: return 0 # 对end值进行升序排序 intervals.sort(key = lambda x: x[1]) # 维护一个最小值 end_pos = intervals[0][1] # 只有单个区间时无重叠!!!因此定义为1 count = 1 # 终止条件 for i in range(1, len(intervals)): # 判断是否连续 if end_pos <= intervals[i][0]: count += 1 end_pos = intervals[i][1] return len(intervals) - count
二维数组排序的方法:intervals.sort(key = lambda x: x[1])
思路转换:求最小移除数组,意味着求最大连续数组
柠檬水找零
输入:bills = [5,5,5,10,20]
输出:true
解释:
前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。
第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。
由于所有客户都得到了正确的找零,所以我们输出 true。
class Solution: def lemonadeChange(self, bills: List[int]) -> bool: five, ten, twenty = 0, 0, 0 for bill in bills: if bill == 5: five += 1 if bill == 10: # 是否可以找回 if five <= 0: return False # 收下 10 元 ten += 1 # 找回 5 元 five -= 1 if bill == 20: # 是否可以找回一张5元和一张10元 if five > 0 and ten > 0: five -= 1 ten -= 1 twenty += 1 # 是否可以找回三张 5 元 elif five >= 3: five -= 3 twenty += 1 else: return False return True
以上就是Python贪心算法Greedy Algorithm解决案例小结的详细内容,更多关于Python贪心算法的资料请关注脚本之家其它相关文章!