1、 本题主要依据一个原则:能量换积分时取小能量,积分换能量时取大能量。所以需要保证数组有序。
2、 先对数组进行排序,然后双指针分别指向数组左右端点。
3、 定义积分:count表示不兑换最后一次,countChange表示兑换最后一次(能量不足时有没有必要兑换)
4、 双指针left>right时循环break,特别说明一下当left=right时可能left或者right数值改变后未进行操作。
5、 当前能量小于最小能量时直接break,返回结果;否则小能量换积分(要保存当前积分值与后续积分换大能量进行比较,考虑是否交换最后一次),left++一次,要再次判断是否left<=right,能量不足时积分换大能量。
6、 循环结束后,要考虑是否交换最后一次能量。
class Solution {
public int bagOfTokensScore(int[] tokens, int P) {
// 先对token做一个排序
Arrays.sort(tokens);
// 双指针 左+1 右减1
int left = 0, right = tokens.length - 1;
// count 记录分数
int count = 0, countChange = 0;
while (true) {
if (left > right) {
break;
}
if (P < tokens[left]) { // 小于最小值
break;
} else {
P -= tokens[left];
countChange += 1;
left++;
count = countChange;
if (left <= right) {
if (P < tokens[left]) { // 能量不足
P += tokens[right];
countChange--;
right--;
}
}
}
}
if (count > countChange) { // 不用再分数换能量
P -= tokens[++right];
right--;
return count;
}
return countChange;
}
}
作者:for62wjb
链接:https://leetcode-cn.com/problems/bag-of-tokens/solution/ling-pai-fang-zhi-by-for62wjb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。