问题描述
小U和小F正在进行一场由n轮组成的英雄决斗比赛。在每一轮中,小U和小F各自从他们的英雄队伍中选出一位英雄进行对决,英雄的能力值将决定比赛的胜负,能力值高者获胜。小U已经按照固定的能力顺序1,2,3,…,n安排了他的英雄出场顺序。
小F希望通过调整他的英雄出场顺序,最大化他的获胜轮数。请帮助小F确定一个最佳的出场顺序,以获得最多的胜利。
输入说明
number: 一个整数,表示比赛的总轮数 n。heroes: 一个长度为 n 的正整数数组,表示小 F 的每个英雄的能力值。
解题思路
题目分析
小U和小F的英雄武力值都是一样的,只不过小U已经按照固定的能力顺序1,2,3,…,n安排了他的英雄出场顺序。现在就是要算出小F的最多获胜次数
解答思路
一开始以为样例中给的
heroes数组就是小U的英雄出场顺序,所以觉得排出小F的英雄出场顺序有点麻烦,想着能不能直接算出小F的获胜次数。
小U和小F的英雄武力值都是一样的,并且要武力值大的那一方才能获胜。所以英雄武力值分成三种情况
- 没有重复的:
最大获胜次数 = number - 1 - 全都是一样的:
最大获胜次数 = 1 - 部分重复: 这个也是最普遍的情况,那么最大获胜次数就会等于
number减去最大重复次数,即最大获胜次数 = number - repeat(max)
代码详解
1. 统计重复次数: 首先统计小F英雄数组中每个英雄能力值出现的次数。用一个LinkedHashSet来装heroes中的基数,用HashMap装heroes中每个元素对应的重复次数
LinkedHashSet<Integer> set=new LinkedHashSet<>();
HashMap<Integer,Integer> repeat=new HashMap<>();
for(int i:heroes){
boolean flag = set.add(i);
if(!flag){
repeat.put(i, repeat.getOrDefault(i, 1)+1);
}
}
2. 找出最大重复次数:找出所有英雄能力值中出现次数最多的次数。
int max=0;
for(Map.Entry<Integer,Integer> entry:repeat.entrySet()){
if(entry.getValue()>max){
max=entry.getValue();
}
}
3. 计算最大获胜次数:number减去最大重复次数。
ans=number-max;
完整代码
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
public class Main {
public static int solution(int number, int[] heroes) {
// Please write your code here
int ans=0;
LinkedHashSet<Integer> set=new LinkedHashSet<>();
HashMap<Integer,Integer> repeat=new HashMap<>();
for(int i:heroes){
boolean flag = set.add(i);
if(!flag){
repeat.put(i, repeat.getOrDefault(i, 1)+1);
}
}
if(set.size()==number)return number-1;
if(set.size()==1)return 0;
int cha=set.size()-1;
if(repeat.size()==1)return cha;
int max=0;
for(Map.Entry<Integer,Integer> entry:repeat.entrySet()){
if(entry.getValue()>max){
max=entry.getValue();
}
}
ans=number-max;
System.out.println(ans);
return ans;
}
public static void main(String[] args) {
// You can add more test cases here
int[] heroes1 = {10, 1, 7, 4, 3, 5, 3};
int[] heroes2 = {1,1,1,1,1};
int[] heroes3 = {1,2,3,4,5,6,7,8,9,10};
System.out.println(solution(7, heroes1) == 4);
System.out.println(solution(5, heroes2) == 0);
System.out.println(solution(10, heroes3) == 9);
}
}