美文网首页
LeetCode 第 649 题:Dota2 参议院

LeetCode 第 649 题:Dota2 参议院

作者: 放开那个BUG | 来源:发表于2024-03-24 18:12 被阅读0次

1、前言

图片.png

2、思路

使用贪心:最优决策为 「每次都选择对方的下一个行权成员进行消除。
起始我们先将 s 中的 Radiant 和 Dire 分别存入有序集合 rs 和 ds 当中,然后从前往后模拟消除过程,过程中使用 idx 代表当前处理到的成员下标,使用 set 记录当前哪些成员已被消除。
当轮到 s[idx] 行权时(若 s[idx] 已被消除,则跳过本轮),从对方的有序队列中取出 「首个大于等于 idx 的下标」;若对方的有序序列不存在该下标,而行权过程又是循环进行的,说明此时下一个行权的对方成员是 「首个大于等于 」 的下标,我们对其进行取出消除,随后往后继续决策。

3、代码

class Solution {
    public String predictPartyVictory(String s) {
        TreeSet<Integer> rs = new TreeSet<>(), ds = new TreeSet<>();
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == 'R'){
                rs.add(i);
            }else {
                ds.add(i);
            }
        }

        Set<Integer> set = new HashSet<>();
        int idx = 0;
        while (rs.size() != 0 && ds.size() != 0){
         if(!set.contains(idx)){
                TreeSet<Integer> tmp = null;
                if(s.charAt(idx) == 'R'){
                    tmp = ds;
                }else {
                    tmp = rs;
                }
                Integer integer = tmp.ceiling(idx);
                if(integer == null){
                    integer = tmp.ceiling(0);
                }
                set.add(integer);
                tmp.remove(integer);
            }
         idx = (idx + 1) % s.length();
        }

        return rs.size() != 0 ? "Radiant" : "Dire";
    }
}

相关文章

网友评论

      本文标题:LeetCode 第 649 题:Dota2 参议院

      本文链接:https://www.haomeiwen.com/subject/jrfmkdtx.html