令牌放置-leetcode948

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值