原题:
25匹马,5条跑道,怎样能用最快方式,得到最快的三匹马,假设每匹马的体力保持不变,速度固定。
解法,堆排序,如下:package org.algorithm.search; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.Set; import java.util.Stack; /** * @author yuewei.wangyw */ public class FindFastestHorse { /** 跑的次数 **/ public static int times = 0; /** * 获得最快的那一匹 * * @param rootHorse 虚拟节点(最快的那一匹马) * @param runWaySize 跑道个数 * @return */ public static Horse findMax(Horse rootHorse, int runWaySize) { // 跑道 List<Horse> runWay = new ArrayList<Horse>(); // 比rootHorse 慢的马 List<Horse> slowerHorses = rootHorse.getSlowerHorses(); // 附加的比较的马匹,当比rootHorse 慢的马分组不够是,需要找更慢的马,进行比较,从而减少比较次数 List<Horse> additionHorses = new ArrayList<Horse>(); // 堆栈,用来实现查找下一匹马的递归实现 Stack<Horse> stack = new Stack<Horse>(); // 跑道个数 int size = runWaySize; // 直到找到最快的马 while (slowerHorses.size() > 1) { // 清除跑道 runWay.clear(); // 清除栈 stack.clear(); // 重置 size = runWaySize; // 对比当前rootHorse慢的马进行分组 for (Iterator<Horse> iter = slowerHorses.iterator(); iter.hasNext() && size-- > 0;) { Horse horse = iter.next(); runWay.add(horse); stack.add(horse); iter.remove(); } // 一旦分组不够,则取更慢的马 if (size > 0) { // 要么已经选够了马,要么没有马可以选