题目描述:
思路:
其实这一题最开始我是使用dfs进行搜索的,状态为dfs(pos, sum);pos为当前枚举的cnt的位置,sum为当前的总和,但是由于数据量较大,容易超时。
其实这一题可以通过将奇数和偶数分离,然后根据cnt来选择不同数量的奇数或者偶数,当然,选择的依据就是从大到小开始选择。
代码:
class Solution {
public int maxmiumScore(int[] cards, int cnt) {
int len = cards.length;
ArrayList<Integer> ji = new ArrayList<>();
ArrayList<Integer> ou = new ArrayList<>();
for (int i = 0 ;i<len;i++){
if(cards[i]%2==1){
ji.add(cards[i]);
}else{
ou.add(cards[i]);
}
}
//排序
ji.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1; //从大到小
}
});
ou.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
ArrayList<Integer> sum_ji = new ArrayList<>();
ArrayList<Integer> sum_ou = new ArrayList<>();
if (ji.size()>0){
sum_ji.add(ji.get(0));
for(int i=1;i<ji.size();i++){
sum_ji.add(sum_ji.get(sum_ji.size()-1)+ji.get(i));
}
}
if (ou.size()>0){
sum_ou.add(ou.get(0));
for (int j=1;j<ou.size();j++){
sum_ou.add(sum_ou.get(sum_ou.size()-1)+ou.get(j));
}
}
int res = 0;
for(int left=0;left<=cnt;left++){
int right = cnt - left;
if (left%2==0 && left<=sum_ji.size() && right<=sum_ou.size()){
if(left==0){
int tmp = sum_ou.get(right-1);
res = Math.max(tmp ,res);
}else if(right==0){
int tmp = sum_ji.get(left-1);
res = Math.max(tmp, res);
}else{
int tmp = sum_ji.get(left-1) + sum_ou.get(right-1);
res = Math.max(tmp ,res);
}
}
}
return res;
}
}
结果: