贪婪法是每一步都尽量采用最优解。

45 跳跃游戏II

45. 跳跃游戏 II

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

输入: [2,3,1,1,4]

输出: 2

解释: 跳到最后一个位置的最小跳跃数是 2。

  1. 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

说明:

假设你总是可以到达数组的最后一个位置。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/jump-game-ii

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    int jump(vector<int>& nums) {
        int size = nums.size();
        if(size == 0 || size == 1)
            return 0;

        int level = 0, i = 0, currentMax = 0, nextMax = 0;

        while(currentMax - i + 1 > 0)
        { 
            level++;
            for(;i <= currentMax; i++)
            {
                nextMax = max(nextMax, nums[i] + i);
                if(nextMax >= size - 1)
                    return level;
            }
            currentMax = nextMax;
        }

        return 0;
    }
};

649 Dota2参议院

649. Dota2 参议院

Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)

Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:

禁止一名参议员的权利:

参议员可以让另一位参议员在这一轮和随后的几轮中丧失所有的权利。

宣布胜利:

      如果参议员发现有权利投票的参议员都是同一个阵营的,他可以宣布胜利并决定在游戏中的有关变化。

给定一个字符串代表每个参议员的阵营。字母 “R” 和 “D” 分别代表了 Radiant(天辉)和 Dire(夜魇)。然后,如果有 n 个参议员,给定字符串的大小将是 n。

以轮为基础的过程从给定顺序的第一个参议员开始到最后一个参议员结束。这一过程将持续到投票结束。所有失去权利的参议员将在过程中被跳过。

假设每一位参议员都足够聪明,会为自己的政党做出最好的策略,你需要预测哪一方最终会宣布胜利并在 Dota2 游戏中决定改变。输出应该是 Radiant 或 Dire。

示例 1:

输入:”RD” 输出:”Radiant” 解释:第一个参议员来自 Radiant 阵营并且他可以使用第一项权利让第二个参议员失去权力,因此第二个参议员将被跳过因为他没有任何权利。然后在第二轮的时候,第一个参议员可以宣布胜利,因为他是唯一一个有投票权的人 示例 2:

输入:”RDD” 输出:”Dire” 解释: 第一轮中,第一个来自 Radiant 阵营的参议员可以使用第一项权利禁止第二个参议员的权利 第二个来自 Dire 阵营的参议员会被跳过因为他的权利被禁止 第三个来自 Dire 阵营的参议员可以使用他的第一项权利禁止第一个参议员的权利 因此在第二轮只剩下第三个参议员拥有投票的权利,于是他可以宣布胜利

提示:

给定字符串的长度在 [1, 10,000] 之间.

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/dota2-senate 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    string predictPartyVictory(string senate) {
        if(senate.size() == 0)
            return "";

        queue<int>radiant;
        queue<int>dire;

        for(int i = 0; i < senate.size(); i++)
        {
            if(senate[i] == 'R')
                radiant.push(i);
            else
                dire.push(i);
        }

        while(!radiant.empty() && !dire.empty())
        {
            int rtop = radiant.front();
            int dtop = dire.front();

            if(rtop < dtop)
            {
                radiant.pop();
                radiant.push(rtop + senate.size());
                dire.pop();
            }
            else
            {
                dire.pop();
                dire.push(dtop + senate.size());
                radiant.pop();
            }
        }

        if(radiant.empty())
            return "Dire";
        else
            return "Radiant";
    }
};