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