贪心算法java - 详解
贪心算法简介
贪心算法是一种在每一步选择中都采取在当前状态下最优(局部最优)的选择,从而希望导致结果是全局最优的算法。贪心算法通常用于解决最优化问题,如最短路径、最小生成树、任务调度等。
贪心算法的基本步骤
- 问题分析:明确问题的目标,确定是否可以通过贪心策略解决。
- 选择贪心策略:设计一个局部最优的选择标准。
- 证明贪心选择性质:确保局部最优选择能导致全局最优解。
- 实现算法:根据贪心策略编写代码。
贪心算法的Java实现示例
示例1:找零问题
给定不同面额的硬币和一个总金额,计算最少需要多少枚硬币来凑成总金额。
import java.util.Arrays;
public class CoinChange {
public static int minCoins(int[] coins, int amount) {
Arrays.sort(coins); // 排序以便从大到小使用
int count = 0;
for (int i = coins.length - 1; i >= 0; i--) {
while (amount >= coins[i]) {
amount -= coins[i];
count++;
}
}
return amount == 0 ? count : -1; // 如果无法凑整返回-1
}
public static void main(String[] args) {
int[] coins = {1, 5, 10, 25};
int amount = 63;
System.out.println("最少硬币数: " + minCoins(coins, amount));
}
}
示例2:活动选择问题
给定一组活动,每个活动有开始时间和结束时间,选择尽可能多的互不冲突的活动。
import java.util.ArrayList;
import java.util.Comparator;
public class ActivitySelection {
static class Activity {
int start, end;
Activity(int start, int end) {
this.start = start;
this.end = end;
}
}
public static ArrayList selectActivities(Activity[] activities) {
ArrayList result = new ArrayList<>();
// 按结束时间排序
Arrays.sort(activities, Comparator.comparingInt(a -> a.end));
result.add(activities[0]);
int lastEnd = activities[0].end;
for (int i = 1; i = lastEnd) {
result.add(activities[i]);
lastEnd = activities[i].end;
}
}
return result;
}
public static void main(String[] args) {
Activity[] activities = {
new Activity(1, 4),
new Activity(3, 5),
new Activity(0, 6),
new Activity(5, 7),
new Activity(8, 9)
};
ArrayList selected = selectActivities(activities);
System.out.println("选择的活动数量: " + selected.size());
}
}
贪心算法的适用条件
- 贪心选择性质:每一步的局部最优选择能导致全局最优解。
- 最优子结构:问题的最优解包含子问题的最优解。
贪心算法的局限性
贪心算法并不总是能得到最优解,例如在部分背包问题中,贪心策略可能无法得到全局最优解。因此,在使用贪心算法前,需要验证其正确性。
总结
贪心算法通过局部最优选择逐步构建全局最优解,适用于某些特定类型的问题。Java实现时,通常需要排序或优先队列来辅助选择。理解贪心算法的适用条件和局限性是正确使用它的关键。

浙公网安备 33010602011771号