软考
APP下载

贪心算法例题与答案

贪心算法是一种最优化算法,通过优先考虑当前局部最优解来达到全局最优解的目的。它的核心思想是在每一步选择中都选择当前状态下最优(即局部最优)的解,从而导致结果最终也是最优(即全局最优)。本文将通过具体例题和答案的分析,从多个角度来介绍贪心算法。

例题1:买卖股票的最佳时机

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意:不能在买入股票前卖出股票。

示例:

输入: [7,1,5,3,6,4]

输出: 5

解释: 在第2天(股票价格 = 1)的时候买入,在第5天(股票价格 = 6)的时候卖出,最大利润只能是5。

答案1:从低点买入高点卖出

贪心的核心理念是要优先考虑当前的最优解。因此在这个例子中,我们需要找到一个最低点买入,然后在未来找到一个当前价值高于此价格的点来卖出,这样我们才能在这次交易中得到最大的收益。在答案中,我们使用了一个变量来跟踪当前最低的点和当前最大的利润。我们一次遍历数组来找到价格最低的点,并且在以后的计算中,只有当当前股票价格高于已知的最低价格时,我们才更新最大利润。

def maxProfit(prices):

lowest = float('inf') # 初始化为正无穷大

max_profit = 0

for price in prices:

if price < lowest:

lowest = price

else:

max_profit = max(max_profit, price - lowest)

return max_profit

时间复杂度:O(n)

例题2:分配饼干

题目描述:每个孩子都有一个满足度,每个饼干有一个大小,只有饼干的大小大于一个孩子的满足度,该孩子才会获得满足。求解最多可以获得满足的孩子数量。

我们的贪心策略应该是尽量保证大饼干分给大需求的小朋友,小饼干分给小需求的小朋友。这样可以让更多的孩子得到满足。

因此,我们需要将孩子需求和饼干大小都从小到大排序。然后使用两个指针分别指向孩子和饼干数组的开头,依次比较大小,如果饼干大小大于等于孩子需求,那么当前孩子的需求被满足,两个指针都向后移动一位,否则说明当前饼干不能满足当前孩子的需求,扫描下一个饼干。

def findContentChildren(g, s) -> int:

g.sort()

s.sort()

i, j = 0, 0

while i < len(g) and j < len(s):

if s[j] >= g[i]:

i += 1

j += 1

return i

时间复杂度:O(nlogn)

在贪心算法中,我们总是希望能够找到一种局部最优的方案,并用它来推导全局最优解。在解决问题时,通常需要思考自己所采用的贪心策略是否正确,具体问题具体分析。

备考资料 免费领取:软件设计师报考指南+考情分析+思维导图等 立即下载
真题演练 精准解析历年真题,助你高效备考! 立即做题
相关阅读
软件设计师题库