题解 | #农场的奶牛分组II# java
农场的奶牛分组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;
}
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。
该题考察的知识点:递归与回溯,代码使用递归和回溯方法来尝试将一组物品分成三个相等的子集,以满足特定条件。
代码的文字解释:
- 计算总体重:遍历整数数组
weights中的每个元素,累加得到总体重totalWeight。 - 判断总体重能否被3整除:如果总体重不能被3整除,就无法将元素分成三个相等的子集,直接返回
false。 - 计算目标每组体重:将总体重除以 3,得到目标每组体重
targetWeight。 - 创建数组来记录每个组的当前体重和:使用
int[] groupSums来存储每个组的当前体重和,长度为 3。 - 调用回溯函数:调用
backtrack方法,传入初始参数进行递归搜索。 - 回溯函数:
private boolean backtrack(int[] weights, int index, int[] groupSums, int targetWeight),这个函数用来进行递归和回溯,尝试将每个元素分配到三个不同的组中,检查是否能满足特定条件。基础情况:如果已经将所有元素分配完毕(index == weights.length),则检查三个组的体重和是否相等,如果相等则返回 true。递归尝试:尝试将当前元素分配到三个不同的组中,如果满足条件则继续递归。回溯:如果分配不满足条件,则回溯,尝试其他可能性,保持组的体重和不变。