第一题
class Solution {
public int findContentChildren(int[] g, int[] s) {
int num=0;
int max=Math.max(g.length,s.length);
int min=Math.min(g.length,s.length);
for(int i=0;i<max;i++){
for(int j=0;j<min;j++){
if(g.length>s.length&&s[j]>=g[i]){
num++;
i++;
}else if(i<m&&g.length<=s.length&&s[i]>=g[j]){
num++;
i++;
}
if(j==min-1) {
break;
};
}
}
return num;
}
}
利用双指针,如果s[j]>=g[i]成立,就将num加一,将两个指针都往后移一位。值得注意的是for循环的条件,如果g.length<=s.length,g.length 为内循环终止条件,以内层循环为主,如果不满足题意,i将加一,继续与每个g[j]比较,满足时,i后移一位,与下一个g[j]比较,直至g[i]比较完毕。如果g.length>s.length,以g.length为外层条件,如果满足题意,i++,否则i不加,g[i]接着与下一个s[j]比较,将s[j]比较一遍后,循环结束。前者外层循环可能不止一次,后者外层循环只有一次。
第二题
class Solution {
public int maxmiumScore(int[] cards, int cnt) {
int msum=0;
Arrays.sort(cards);
int j=0;
for(int i=cards.length-1;i>0;i--){
int sum=0;
int n=cnt;
if(cnt==1&&cards[i]%2==0){
//sum=cards[i];
msum=cards[i];
}else if(cnt>1){
//int hhh=cards.length-1;
while(n>0){
sum+=cards[i];
i--;
n--;
}
// if(n>0){
// n--;
// }
if(sum%2==0){
msum=sum;
}else{
int a=0;
int b=0;
if(cards[i+1]%2==0){
while(i>=0&&cards[i]%2!=0){
a=sum-cards[i+1]+cards[i];
i--;
}
}else if(cards[i+1]%2!=0){
//i++;
while(i>=0&&cards[i]%2==0){
b=sum-cards[i+1]+cards[i];
i--;
}
}
msum=Math.max(a,b);
}
}
// if(sum%2==0){
// msum=Math.max(msum,sum);
// }
}
return msum;
}
}
思路:首先对数组进行升序排序,如果只需抽取一张牌时,从数组末尾寻找最大的偶数,并返回。如果需要抽取多张时,用sum存储cnt个最大的数组元素,然后判断sum是否是偶数,如果是,则返回,如果不是且没有抽取完所有的牌,则分两个方案,去除一个奇数,增加一个剩余元素中的最大的偶数,或取出一个偶数,增加一个最大的奇数,最后比较这两个方案中的和的最大值,然后返回这个最大值。