题目解析:英雄决斗的最大胜利次数 | 豆包MarsCode AI刷题

77 阅读2分钟

问题描述

小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中的基数,用HashMapheroes中每个元素对应的重复次数

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);
    }
}