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

猜你喜欢

转载自blog.csdn.net/for62/article/details/107994302