1.令牌放置
题目:
你的初始 能量 为 P,初始 分数 为 0,只有一包令牌 tokens 。其中 tokens[i] 是第 i 个令牌的值(下标从 0 开始)。
令牌可能的两种使用方法如下:
如果你至少有 token[i] 点 能量 ,可以将令牌 i 置为正面朝上,失去 token[i] 点 能量 ,并得到 1 分 。
如果我们至少有 1 分 ,可以将令牌 i 置为反面朝上,获得 token[i] 点 能量 ,并失去 1 分 。
每个令牌 最多 只能使用一次,使用 顺序不限 ,不需 使用所有令牌。
在使用任意数量的令牌后,返回我们可以得到的最大 分数 。
思路:因为得到能量和失去能量,所相关的分数都是1,所以是尽可能将大的数字换成能量,小的数字换成得分。
所以先排序,然后然后从最小的数字开始换成得分。如果能量不够,就把得分换成最大的数字。如果没得分,能量又比最小的数字小,说明不能换能量。直接退出
时间复杂度O(nlogn) 空间复杂度O(logn)
/**
* @param {number[]} tokens
* @param {number} P
* @return {number}
*/
var bagOfTokensScore = function(tokens, P) {
tokens.sort((a, b) => a - b);
const l = tokens.length;
let left = 0;
let right = l - 1;
let c = 0;
let max = 0;
while (right >= left) {
if (P < tokens[left] && !c) break;
if (P < tokens[left]) {
P += tokens[right];
right--;
c--;
} else {
P -= tokens[left];
left++;
c++;
max = Math.max(c, max);
}
}
return max;
};
2.给定数字能组成的最大时间
题目:
给定一个由 4 位数字组成的数组,返回可以设置的符合 24 小时制的最大时间。
24 小时格式为 "H