贪心算法之安排最多会议问题
问题: 有多个会议是预约, 如何安排最多的会议, 比如预定时间有:【8,9】,【9,10】,【12,18】,【8,18】。 那么最多在安排是【8,9】,【9,10】,【12,18】3 个。
可选的贪心有
1:根据最小的开始时间来。【8,18】 这个就不行,排除。
2:根据区间最小的来。【8,10】,【10,18】, 【9,10】这个也不行。
3:根据最早的结束时间来。这个是OK的。没法证明, 暴力尝试是OK。
代码实现
package algorithm;import java.util.Arrays;import java.util.Random;public class TanXinAlgorithm {/*** 会议室开会时间预定, 开始时间, 结束时间, 【1,3】,【2,8】, 【3,5】, 【5,7】, 【1,8】* <p>* 选择连续最多能安排最多的会议*/public static class Entry {public int start;public int end;public Entry(int start, int end) {this.start = start;this.end = end;}public String toString() {return "[" + start + "," + end + "]";}}public static Entry[] getRandom(int length) {Entry[] entries = new Entry[length];Random random = new Random();for (int i = 0; i < length; i++) {int prev = random.nextInt(12);entries[i] = new Entry(prev, prev + random.nextInt(12) + 1);}return entries;}public static void main(String[] args) {for (int i = 0; i < 10000; i++) {Entry[] a = getRandom(3);int violence2 = violence(a, 0, 0);int violence1 = planMeetingRoom(a);if (violence1 != violence2) {System.out.println(Arrays.toString(a));System.out.println("Oops!! method: " + violence1 + " method2: " + violence2);return;}}System.out.println("successfully");}public static int planMeetingRoom(Entry[] data) {if (data == null || data.length <= 0) {return 0;}/*按照结束时间最小,去贪心算法*/Arrays.sort(data, (prev, next) -> {if (prev.end == next.end) {return prev.start - next.start;}return prev.end - next.end;});int max = 1, end = data[0].end;for (int i = 1; i < data.length; i++) {if (data[i].start >= end) {max++;end = data[i].end;}}return max;}/*** 递归暴力解法** @param data 数据* @param done 最大* @param dateline 当前时间* @return 结果*/public static int violence(Entry[] data, int done, int dateline) {if (data == null || data.length <= 0) {return done;}int max = done;for (int i = 0; i < data.length; i++) {if (data[i].start >= dateline) {Entry[] newData = exceptEntity(data, i);max = Math.max(max, violence(newData, done + 1, data[i].end));}}return max;}private static Entry[] exceptEntity(Entry[] data, int i) {Entry[] entries = new Entry[data.length - 1];int cursor = 0;for (int j = 0; j < data.length; j++) {if (j == i) {continue;}entries[cursor++] = data[j];}return entries;}}
