1 3 3 1 1 3
输出:3
1 3 5
输出:0
2 3 5
输出:2
7 7 7 7
输出:4
解题思路:
最开始看错题,以为是尽量求层数最多的组合,那就是各种全排列都要考虑了,原来题目说明所有的积木都要用上。这就简单,先将所有积木从大到小排序,每层可以是1根也可以2根,那第一层就只有两种情况,第一根作底,第一加倒数最小作底。然后第二层一样,要么是第二根,要么就是第二根+倒数剩下最小那根。所以这个题就变成了类似双指针的问题,我是用递归来处理双指针,其实也可以直接while循环来处理
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
String[] sa1 = sc.nextLine().split(" ");
Integer[] nums = new Integer[sa1.length];
for(int i=0; i< nums.length;i++) {
nums[i] = Integer.valueOf(sa1[i]);
}
Arrays.sort(nums, (x,y) -> y-x);
// 先用1根最大的积木作第一层
int ok = solution(nums, 1, nums.length-1, nums[0], 1);
if(ok ==0) { //表示起始拿一根最大的解决不了问题
//用最大的+最小的作第一层
ok = solution(nums, 1, nums.length-2, nums[0]+nums[nums.length-1], 1);
}
System.out.println(ok);
}
}
public static int solution(Integer[] nums, int leftIndex,
int rightIndex, int preVal, int count){
int isOK = 0;//0表示不成功的情况
if(preVal == nums[leftIndex]) {//先尝试拿一根积木
if(leftIndex == rightIndex) {
return count+1;
}
return solution(nums, leftIndex+1, rightIndex, preVal, count+1);
}else if(leftIndex<rightIndex && preVal == (nums[leftIndex]+nums[rightIndex])){ // 拿两根积木
if(leftIndex == rightIndex-1) {
return count+1;
}
// 用了两根积木,左右指针都需要递变
return solution(nums, leftIndex+1, rightIndex-1, preVal, count+1);
}
return isOK;
}