定义
贪心算法又叫做贪婪算法,它在求解某个问题是,总是做出眼前最大利益。
特点
- 局部最优解
- 通过局部最优推出全局最优
习题
- 某天早上公司领导找你解决一个问题,明天公司有N个同等级的会议需要使用同一个会议室,现在给你这个N个会议的开始和结束时间,你怎么样安排才能使会议室最大利用?即安排最多场次的会议?
会议时间:0点~9点 | 8点~10点 | 10点~12点 | 8点到~20点
思考:
这里先给出解决方案:以结束时间按从小到大排序,就能得出最优解。
首先为什么开始选择最小的9点而不是10点,由于一天只有24个小时,开始选择9点意味着后面还剩15个小时安排其他会议,而选择10点后面只剩14个小时安排会议,显然15个小时安排更多会议的可能性比14个小时安排更多会议的可能性要大,因此证明开始选择越小的结束时间越好。这里就是它的贪心策略。
同理可得,当确认第一个之后,后面要选的只要选择开始时间>=前面会议的结束时间&&结束时间更小的那个,因为结束时间更小,给后面预留安排会议的时间越大嘛。以上。
代码
public class Meeting implements Comparable<Meeting> { public int number; public int startTime; public int endTime; public Meeting(int number, int startTime, int endTime) { this.number = number; this.startTime = startTime; this.endTime = endTime; } @Override public int compareTo(Meeting o) { if (endTime > o.endTime) return 1; return -1; } @Override public String toString() { return "Meeting{" + "number=" + number + ", startTime=" + startTime + ", endTime=" + endTime + '}'; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int next = scanner.nextInt(); List<Meeting> meetings = new ArrayList<>(); for (int i = 1; i <= next; i++) { int startTime = scanner.nextInt(); int endTime = scanner.nextInt(); meetings.add(new Meeting(i, startTime, endTime)); } meetings.sort(null); System.out.println(meetings); System.out.println("==============="); int curTime = 0; for (Meeting meeting : meetings) { if(meeting.startTime>=curTime){ System.out.println(meeting); curTime = meeting.endTime; } } } }