昨天发了一篇豆包AI的做题体验,我们做了一道简单题,今天就来一道中等题来练练手叭~
英雄决斗的最大胜利次数
问题描述
小U和小F正在进行一场由 nn 轮组成的英雄决斗比赛。在每一轮中,小U和小F各自从他们的英雄队伍中选出一位英雄进行对决,英雄的能力值将决定比赛的胜负,能力值高者获胜。小U已经按照固定的能力顺序 1,2,3,…,n1,2,3,…,n 安排了他的英雄出场顺序。
小F希望通过调整他的英雄出场顺序,最大化他的获胜轮数。请帮助小 F 确定一个最佳的出场顺序,以获得最多的胜利。
输入说明
number: 一个整数,表示比赛的总轮数 nn。heroes: 一个长度为 nn 的正整数数组,表示小 F 的每个英雄的能力值。
输出
- 返回一个整数,表示小 F 可以获得的最大胜利轮数。
测试样例
样例1:
输入:
number = 7, heroes = [10, 1, 1, 1, 5, 5, 3]
输出:4
样例2:
输入:
number = 5, heroes = [1, 1, 1, 1, 1]
输出:0
样例3:
输入:
number = 6, heroes = [9, 4, 7, 3, 2, 6]
输出:6
这道题做题大致的思路就是先进行排序,然后使用双指针遍历。这道题给我的感觉就是直接去构思,然后写出来。我把每道题的思路写在了代码里。
import java.util.Arrays;
public class Main {
public static int solution(int number, int[] heroes) {
// Step 1: 对小F的英雄能力值进行升序排序
Arrays.sort(heroes);
int uPointer = 1; // 小U的英雄能力值从 1 开始
int fPointer = 0; // 小F的英雄数组指针
int winCount = 0; // 记录小F获胜的轮数
// Step 2: 使用双指针遍历
while (uPointer <= number && fPointer < number) {
// 如果小F的当前英雄能力值大于小U的当前英雄
if (heroes[fPointer] > uPointer) {
winCount++; // 小F赢得一轮
uPointer++; // 小U指针移到下一个英雄
}
fPointer++; // 小F指针移到下一个英雄
}
return winCount;
}
public static void main(String[] args) {
// 测试样例
System.out.println(solution(7, new int[]{10, 1, 1, 1, 5, 5, 3}) == 4);
System.out.println(solution(5, new int[]{1, 1, 1, 1, 1}) == 0);
System.out.println(solution(6, new int[]{9, 4, 7, 3, 2, 6}) == 6);
}
}
核心思路:
- 排序:首先对小F的英雄能力值数组进行升序排序。这样我们可以从小到大依次安排小F的英雄出场。
- 双指针遍历:使用两个指针,一个指向小U的英雄能力值(从1开始),另一个指向小F的英雄能力值数组。
- 比较与计数:遍历过程中,比较小F当前英雄的能力值与小U当前英雄的能力值。如果小F的英雄能力值大于小U的英雄能力值,则小F获胜,计数器加1,并且两个指针都向前移动。否则,只移动小F的指针。