开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
今天发现居家不再需要病假了,转居家办公,真不错
移除石子的最大得分
该题出自力扣的1753题 —— 移除石子的最大得分【中等题】
审题
你正在玩一个单人游戏,面前放置着大小分别为 a、b 和 c 的 三堆 石子。 每回合你都要从两个 不同的非空堆 中取出一颗石子,并在得分上加 1 分。当存在 两个或更多 的空堆时,游戏停止。 给你三个整数 a 、b 和 c ,返回可以得到的 最大分数 。
- 这道题的题意感觉是跟数学规律有关,给出3个整型变量,分别代表3堆石子,每次从两个变量内取1粒石子,求出最多可以取多少次,条件是,如果存在两个或以上的空堆,则结束
- 取最多,毫无疑问是从最多的那堆石子下手,那么就可以形成一个规律
- 假设 a < b < c,当 a + b <= c 时,证明a和b都可以与c 进行匹对,并且消耗完毕,所以返回a + b即可
- 当 a + b > c 时,那么就证明大的堆数存在于a 和 b 之间,就对 a 和 b进行缩减,为了让石头尽可能多匹配几次。我们先让a和b去匹配,一旦a+b的和小于c的时候,就可以用c把他们全部匹配掉。
- 每次都拿最多的两堆,一定最优,按照这个策略,当一个堆大于另外两个之和时,答案就是另外两个相加。如果较少的两堆石子数量和大于等于另一堆,那么最大的那一堆一定可以被取完,所以此时的最大分数 = 最大堆的石子数量+先取较小两堆直到它们的数量和等于最大堆数量时获得的分数
编码
class Solution {
public int maximumScore(int a, int b, int c) {
int[] nums = new int[]{a,b,c};
Arrays.sort(nums);
if (nums[0] + nums[1] <= nums[2]){
return nums[0] + nums[1];
}
return maximumScore(nums[0] -1,nums[1] -1,nums[2]) + 1;
}
}