贪心算法
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
下面我们来看一道例题来更加深刻的理解一下贪心算法的思想以及其应用。
本题来自LeetCode
公司计划面试 2N 人。第 i 人飞往 A 市的费用为 costs[i][0],飞往 B 市的费用为 costs[i][1]。
返回将每个人都飞到某座城市的最低费用,要求每个城市都有 N 人抵达。
输入:[[10,20],[30,200],[400,50],[30,20]]
输出:110
解释:
第一个人去 A 市,费用为 10。
第二个人去 A 市,费用为 30。
第三个人去 B 市,费用为 50。
第四个人去 B 市,费用为 20。
最低总费用为 10 + 30 + 50 + 20 = 110,每个城市都有一半的人在面试。
在不考虑别的算法的情况下,针对于贪心算法来说,本题是一个非常经典的题,非常有助于对贪心算法的理解。
为了保证最低费用,那么对于局部来说就必须保证去A的费用足够低,去B的费用也足够低。那么我们采取做差的方法,用A减去B的差,可以看出这个差越大说明A费用大,差越小则A费用越小。
那么下面直接来看代码:
class Solution:
def twoCitySchedCost(self, costs):
costs.sort(key=lambda x: (x[0]-x[1]))
print(costs)# 计算去A地和去B低的费用差,然后按照费用差排序
length_costs = len(costs)
result = 0
# 那么排序出来可以得到,前半部分A很小,B很大;同理后半部分B很小,A很大。
result += sum([i[0] for i in costs[:length_costs//2]]) # 前半部分去A地
result += sum([i[1] for i in costs[length_costs//2:]]) # 后半部分去B地
return result
相应的解释在代码中也写了注释,应该一看就懂,如有不对还请指教~