屈老师关于锦标赛算法选择次优元素的讲解视频地址:www.bilibili.com/video/BV1Ls… ,屈老师的讲解逻辑缜密,通俗易懂,这里不再画蛇添足,主要着眼于代码的实现,也算是抛砖引玉。
代码:
/**
* 模拟锦标赛选取次优的元素
* @param {number[]} arr
* @returns {number} second best number
*/
function tournament(arr) {
// 使用Map来记录该Key所淘汰的元素
let recorder = new Map();
let max = _tour(arr);
// 返回冠军所淘汰元素中最大的值
return Math.max(...recorder.get(max));
// 每一轮比赛淘汰一半的的元素
function _tour(array) {
// 用数组记录本轮比赛的胜者
let winners = [],
len = array.length;
// 只剩一个元素时,比赛结束,该值即为冠军
if (len == 1)
return array[0];
for (let i = 0; i < len - 1; i += 2) {
let max = Math.max(array[i], array[i + 1]),
min = Math.min(array[i], array[i + 1]);
recorder.has(max) ? recorder.get(max).push(min) : recorder.set(max, [min]);
winners.push(max);
}
// 元素数量为奇数时,轮空最后一个元素到下一场比赛
len % 2 == 1 ? winners.push(array[len - 1]) : null;
// 开始下一轮比赛
return _tour(winners);
}
}