Java 题解 | #农场的奶牛分组II#
农场的奶牛分组II
https://www.nowcoder.com/practice/ae745225d12f44ca9e84486d051edbfa
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param weights int整型一维数组
* @return bool布尔型
*/
public boolean canPartitionII (int[] weights) {
// write code here
int n = weights.length;
int totalWeight = 0;
for (int weight : weights) {
totalWeight += weight;
}
// 如果总体重不能被3整除,无法分成三组,直接返回false
if (totalWeight % 3 != 0) {
return false;
}
// 目标每组体重
int targetWeight = totalWeight / 3;
int[] groupSums = new int[3];
// 调用回溯函数进行尝试分组
return backtrack(weights, 0, groupSums, targetWeight);
}
// 回溯函数
private boolean backtrack(int[] weights, int index, int[] groupSums,
int targetWeight) {
// 所有奶牛都已分完,检查三组的体重和是否相等
if (index == weights.length) {
return groupSums[0] == targetWeight && groupSums[1] == targetWeight &&
groupSums[2] == targetWeight;
}
// 尝试将当前奶牛分到三组中的某一组
for (int i = 0; i < 3; ++i) {
if (groupSums[i] + weights[index] <= targetWeight) {
groupSums[i] += weights[index];
if (backtrack(weights, index + 1, groupSums, targetWeight)) {
return true;
}
groupSums[i] -= weights[index];
}
}
return false;
}
}
编程语言是Java。
该题考察的知识点是回溯算法
代码的文字解释如下:首先计算所有奶牛的总体重,如果总体重不能被3整除,则无法分成三组,直接返回false。然后计算目标每组体重targetWeight,即总体重除以3。使用一个长度为3的数组groupSums来保存每组的体重和,初始值为0。调用回溯函数backtrack来进行尝试分组,并返回分组是否成功的结果。
回溯函数backtrack递归地遍历每个奶牛,并尝试将其分到三组中的某一组,判断加入后该组的体重和是否小于等于targetWeight。如果满足条件,则将奶牛加入该组中,并继续递归地处理下一个奶牛。如果递归返回true,表示成功找到了一种分组方式,直接返回true。如果递归返回false,表示该分组方式不合适,需要将奶牛从当前组中移出,继续尝试其他分组方式。最终如果所有奶牛都已分完,检查三组的体重和是否相等,如果相等则返回true,否则返回false。