描述
有 n
个硬币排成一条线, 第 i
枚硬币的价值为 values[i]
.
两个参赛者轮流从任意一边取一枚硬币, 直到没有硬币为止. 拿到硬币总价值更高的获胜.
请判定 第一个玩家 会赢还是会输.
样例
- 样例 1:
输入:
[3, 2, 2]
输出:true
解释: 第一个玩家在刚开始的时候拿走 3, 然后两个人分别拿到一枚 2.
- 样例 2:
输入:
[1, 20, 4]
输出:false
解释: 无论第一个玩家在第一轮拿走 1 还是 4, 第二个玩家都可以拿到 20.
挑战
在 n 是偶数时做到O(1) 空间, O(n) 时间
代码实现
function firstWillWin(values) {
// write your code here
// write your code here
let len = values.length;
// let dp = [];
if (len <= 2 || len % 2 == 0) {
console.log(true);
return true;
}
var dp = new Array(); //先声明一维
for (var i = 0; i < len; i++) {
dp[i] = new Array(i); //在声明二维
for (var j = 0; j < len; j++) {
dp[i][j] = 0;
}
}
var tdp = new Array(); //先声明一维
for (var i = 0; i < len; i++) {
tdp[i] = new Array(i); //在声明二维
for (var j = 0; j < len; j++) {
tdp[i][j] = 0;
}
}
for (let i = 0; i < len; i++) {
dp[i][i] = values[i];
tdp[i][i] = 0;
}
for (let l = 2; l <= len; l++) {
for (let i = 0; i <= len - l; i++) {
let j = l + i - 1;
let left = values[i] + tdp[i + 1][j];
let right = values[j] + tdp[i][j - 1];
if (left > right) {
dp[i][j] = left;
tdp[i][j] = dp[i + 1][j];
} else {
dp[i][j] = right;
tdp[i][j] = dp[i][j - 1];
}
}
}
console.log(dp[0][len - 1] > tdp[0][len - 1]);
return dp[0][len - 1] > tdp[0][len - 1];
}