1253. 重构 2 行二进制矩阵
1253. 重构 2 行二进制矩阵
题目

题解
使用贪心算法。
首先,一个肯定的点是:
- 当colsum的元素为2时,相同下标的两个二进制数组元素必须为1
- 当colsum的元素为0时,相同下标的两个二进制数组元素必须为0
如此一来,我们只需要决策,当colsum元素为1时,哪个数组的元素为1即可。而这一点的判断,则可以取决于对upper的判断,我们只需贪心地先试图填满upper数组,那么lower数组的值自然能够确定下来。
class Solution {
public List<List<Integer>> reconstructMatrix(int upper, int lower, int[] colsum) {
// 获取每行数组的长度,并初始化每行数组
int sizeOfArray = colsum.length;
int[] a1 = new int[sizeOfArray];
int[] a2 = new int[sizeOfArray];
// 定义当前状态下的upper和lower
int currUpper = 0;
int currLower = 0;
// 标记是否有解,默认有解
boolean flag = true;
for(int i=0;i<sizeOfArray;i++){
int el = colsum[i];
// 填充el=2时两个数组的元素
if (el == 2) {
a1[i] = 1;
a2[i] = 1;
currUpper++;
currLower++;
}
// 填充el=0时两个数组的元素
// 因为定义的是基本数据类型的数组,这一步可以省略
}
for(int i=0;i<sizeOfArray;i++){
int el = colsum[i];
if (el == 1) {
// 此时, el = 1, 我们需要决策,这个1分配给哪个数组
// 优先填充upper数组
if (currUpper < upper) {
a1[i] = 1;
currUpper++;
} else {
a2[i] = 1;
currLower++;
}
}
// 当 currUpper <= upper 且 currLower <= lower 时,才可能是有解的
flag = currUpper <= upper && currLower <= lower;
if (!flag) {
break;
}
}
List<List<Integer>> result = new ArrayList();
// System.out.println(Arrays.stream(a1).boxed().collect(Collectors.toList()));
// System.out.println(Arrays.stream(a2).boxed().collect(Collectors.toList()));
flag = flag && currUpper == upper && currLower == lower; // 判断是否有解
if (flag) {
result.add(Arrays.stream(a1).boxed().collect(Collectors.toList()));
result.add(Arrays.stream(a2).boxed().collect(Collectors.toList()));
}
return result;
}
}

浙公网安备 33010602011771号