前言
贪心思想 与 队列数据结构的配合,算法题往往就是这样,一种思想配一些数据结构来完美解题。
一、dota2参议院
二、贪心与队列
target:每个人都有禁止别人 和 被别人禁止的 功能,有两队人马,根据顺序,以最好的策略禁止对方,那边会赢?
1-什么是最好的方式禁止对方?
一方得到投票权,那就把最近的另一方可投票的人禁止,让其发挥不了禁止权就被踢出局,那么前一方就尽可能的少损失队员。
core:让一个人还没发挥禁止权就把他踢出局,这是最好的;其次才是把发挥过禁止权的踢出局;
2-怎么才能快速找到另一方的投票人(找到了才能禁止啊!)?
可把两方分类,存入两方人的位置。
3-怎么才能把把禁止的人踢出,而且让禁止别人的人放在后面下一轮再投票?
位置处于小的即处于优势,另一类出队列就不用再入队了,有优势一方入队,且只能在下一轮有禁止优势,则将位置增大n >= senate.length
package everyday.greed;
import java.util.LinkedList;
import java.util.Queue;
// Dota2参议院
public class PredictPartyVictory {
/*
target:每个人都有禁止别人 和 被别人禁止的 功能,有两队人马,根据顺序,以最好的策略禁止对方,那边会赢?
什么是最好的方式禁止对方?一方得到投票权,那就把最近的另一方可投票的人禁止,让其发挥不了禁止权就被踢出局,那么前一方就尽可能的少损失队员。
core:让一个人还没发挥禁止权就把他踢出局,这是最好的;其次才是把发挥过禁止权的踢出局;
怎么才能快速找到另一方的投票人(找到了才能禁止啊!)?可把两方分类,存入两方人的位置。
怎么才能把把禁止的人踢出,而且让禁止别人的人放在后面下一轮再投票?
位置处于小的即处于优势,另一类出队列就不用再入队了,有优势一方入队,且只能在下一轮有禁止优势,则将位置增大n >= senate.length
注:模拟起来复杂的地方,就应该换思路/换角度看,利用已学的数据机构和算法思维来关联。
注:多问为什么?不仅包括深挖与探究,还包括为什么会想到这个解题答案,问题与答案有什么关联?不能纯靠题感!要双份保险,让我笔试能过。
注:平时主多个为什么;竞赛主题感。毕竟平时的积累,才能把题感拉起来。
*/
public String predictPartyVictory(String senate) {
// 位置属性 & 类别属性
Queue<Integer> r = new LinkedList<>();
Queue<Integer> d = new LinkedList<>();
char[] arr = senate.toCharArray();
int i = 0, n = arr.length;
for (char c : arr) {
if (c == 'R') r.offer(i++);
else d.offer(i++);
}
while (!r.isEmpty() && !d.isEmpty()) {
int a = r.poll(), b = d.poll();
if (a < b) {
r.offer(a + n);
} else d.offer(b + n);
}
return r.isEmpty() ? "Dire" : "Radiant";
}
}
总结
1)模拟起来复杂的地方,就应该换思路/换角度看,利用已学的数据机构和算法思维来关联。
2)多问为什么?不仅包括深挖与探究,还包括为什么会想到这个解题答案,问题与答案有什么关联?不能纯靠题感!要双份保险,让我笔试能过。
3)平时主多个为什么;竞赛主题感。毕竟平时的积累,才能把题感拉起来。