其他分享
首页 > 其他分享> > 390. 消除游戏

390. 消除游戏

作者:互联网

查看原题

解题思路(循环模拟删除过程)

很不幸这种方法爆了,超时,但思路就是这样。

代码


/**
 * @param {number} n
 * @return {number}
 */
var lastRemaining = function(n) {
	let arr = [];
	for(let i = 1;i<=n;i++){
		arr.push(i);
	}
	let flag = 1;
	while (arr.length > 1){
		let length = arr.length;
		// 从左到右消除
		if(flag % 2 === 1){
			for(let j = 0;j<Math.ceil(length / 2);j++){
				if(arr.length > 1){
					arr.splice(j,1);
				}
			}
		}else{
			// 从右往左消除
			for(let j = length -1;j>=0;j-=2){
				if(arr.length > 1){
					arr.splice(j,1)
				}
			}
		}
		flag++;
	}
	return arr[0];
};

解题思路(参考别人题解)

f(n) 表示从左到右剩下的数字的结果, f'(n) 表示从右到左删除的结果
对称性: f(n) + f'(n) = n + 1
递归性: f(n) = 2 * f'(n/2)
初始条件: f(1) = f'(1) = 1

根据以上条件可得: f(2 * n)/2 + f(n) = n + 1
f(n)/2 + f(n/2) = n/2 + 1
f(n) = (n/2 + 1 - f(n/2)) * 2

代码

/**
 * @param {number} n
 * @return {number}
 */
var lastRemaining = function(n) {
	return n == 1 ? 1 : 2 * (parseInt(n / 2) + 1 - lastRemaining(parseInt(n / 2)));
};

标签:arr,return,游戏,number,length,390,let,lastRemaining,消除
来源: https://www.cnblogs.com/xyq135/p/15757451.html