这个题是第五题寻找最大葫芦:
这是个简单题。
题目大意是在array数组中选中三张相同的牌,和两张相同的牌,他们加起来的和要小于参数中的max,如果是直接选择相加和最大的五张牌,其实很好写;但它加上了小于max的条件,就要复杂一点了,我直接用的最暴力的写法。
我是将符合条件的满足三张相同的牌组成一个数组flag1,满足两张相同的牌组成另一个数组flag2,排序后,使两个数组从小到大排列,设置一个maxt存储当前找到的最大值,设置一个maxi存储当前找到最大值的三张牌的value,设置一个maxj存储当前找到的两张牌的value。然后用for循环去找符合要求的sum(需要满足sum<=max并且sum>=maxt)
这个题目我提交上去,第四个样例出错了,样例是:n=31,m=42,[3,3,11,12,12,2,13,5,13,1,13,8,8,1,8,13,12,9,2,11,3,5,8,11,1,11,1,5,4,2,5]
对应的符合条件的flag1数组和flag2数组分别为:
flag1=[ 1, 2, 3, 5, 8, 11, 12, 13 ]; flag2=[ 1, 2, 3, 5, 8, 11, 12, 13 ]
我的结果是[12,3],那么相应的sum=123+32=42, 但是预期结果是[1,13],对应的sum=13+132=29
我觉得相对比预期结果,我的这个输出更像是对的。
这个题我是用的JavaScript写的,我就放这个代码
function solution(n, max, array) {
let arr = new Array(14).fill(0);//存储每张面值的牌的出现次数
let flag1 = [];//存储满足三张相同的牌的面值
let flag2 = [];//存储满足两张相同的牌的面值
for (let i = 0; i < n; i++) {
arr[array[i]]++;
if (arr[array[i]] == 3) {
flag1.push(array[i]);
}
if (arr[array[i]] == 2) {
flag2.push(array[i]);
}
}
//将对应的flag1数组和flag2数组从小到大排序,为了保证输出结果是较大的值
flag1.sort(function (a, b) {
return b - a;
});
flag2.sort(function (a, b) {
return b - a;
});
//maxt,maxi,maxj分别存储当前找到的最大值,当前找到最大值的三张牌的面值,当前找到的两张牌的面值
let maxt = -1, maxi = 0, maxj = 0;
for (let i = 0; i < flag1.length; i++) {
for (let j = 0; j < flag2.length; j++) {
let sum = flag1[i] * 3 + flag2[j] * 2;
if (sum <= max && sum > maxt) {
maxt = sum;
maxi = flag1[i];
maxj = flag2[j];
}
}
}
//无符合要求的情况
if (maxt == -1) {
return [0, 0];
} else {
return [maxi, maxj];
}
}