题目描述
牛妹在和牛牛玩扔骰子,他们的游戏规则有所不同;
每个人可以扔n次m面骰子,来获得n个数
得分为任意选取n个数中的某些数求和所不能得到的最小的正整数
得分大的人获胜
例如扔骰子3次得到了 1 2 5,那么这个人的得分是4
牛妹想知道这回合她是否能赢
牛妹的n个数存在数组a中,牛牛的n个数存在数组b中
数组下标从0开始
如果牛妹能在这回合胜利则输出Happy,否则输出Sad
方法一:哈希解法
求解思路
对于求解本题牛妹能否在这回合胜利,我们想到使用哈希的做法来求解,首先我们定义一个数组,用来存放所有的累加和,并且保证这个数组是增序的。然后我们遍历整个数组,求出所有的累加和,然后将累加和与题目输入的数据进行比较,当出现第一个与数组元素不同的值,则是我们所要求的分数。
解题代码
import java.util.*;
public class Solution {
public String Throwdice (int n, int m, int[] a, int[] b)
{
return getScore(a,n)>getScore(b,n)?"Happy":"Sad"; // 如果牛妹的得分大于牛牛,则输出Happy,否则输出Sad
}
private int getScore(int[] nums,int n) // 计算牛牛或牛妹的得分
{ //记录所有可能的求和,并保证这些值是有序的
Set<Integer> myset=new TreeSet<>();
for(int i=0;i<n;i++)
{ //枚举出所有可能的累加和
int sum=0;
for(int j=i;j<n;j++)
{
sum+=nums[j];
myset.add(sum); // 记录累加和
}
}
int mycur=1;
for(Integer num:myset)
{ //如果当前累加和存在,cur自增1
if(num==mycur)
{
mycur++;
}
else //如果不存在,返回cur
{
return mycur;
}
}
return mycur; // 返回结果
}
}复杂度分析
时间复杂度:两层循环加一层内插元素,因此时间复杂度为(
)
空间复杂度:使用myset数组,因此空间复杂度为
方法二:贪心的思想求解
求解思路
对于本题目我们也可以采用贪心的思想进行求解,首先我们对题目所给的输入进行排序,保证累加和是从小到大的递增顺序,然后遍历递增顺序的数组,保证新增的数字在原范围的基础上加1之内,这样遍历题目所给的数组,当出现第一个不在原范围加1的数字,那么就输出它,最终得到本问题的答案。
解题代码
import java.util.*;
public class Solution {
public String Throwdice (int n, int m, int[] a, int[] b)
{
return getScore(a,n)>getScore(b,n)?"Happy":"Sad"; //如果牛妹的得分大于牛牛,则输出Happy,否则输出Sad
}
private int getScore(int[] nums,int n)
{ //对数组进行排序
Arrays.sort(nums);
//记录累加和
int mysum=0;
for(int i=0;i<n;i++)
{ //如果当前nums[i]>sum+1,那么[nums[i],nums[i]+sum]与[1,sum]之间就缺了一个sum+1
if(nums[i]>mysum+1)
{
break;
}
mysum+=nums[i]; // 继续累加求和
}
return mysum+1; // 返回结果
}
}复杂度分析
时间复杂度:一层循环内嵌一次排序,因此时间复杂度为
空间复杂度:使用常数级内存空间,因此空间复杂度为

京公网安备 11010502036488号