1、前言
图片.png2、思路
使用贪心:最优决策为 「每次都选择对方的下一个行权成员进行消除。
起始我们先将 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";
}
}
网友评论