概要
填充元素只能为0 或者 1
填充的是一个两行N列的矩阵
初始化矩阵全部填充0
先把同一列,上下两行为1的填充
接着就只剩下要么上面填1下面填0或者上面填0下面填1
遍历是遍历列
如果列之和 等于1 ,且此时upper > 0 优先上面填充1,同时 --upper
如果 此时是lower > 0那么就填充下面为1 上面不管,同时 --lower
代码展示
class Solution {
public:
vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int>& colsum) {
//满足 upper + lower = colsum
// colsum长度确定列数
//填充2行n列的矩阵 填充的元素不是0就是1
//筛选一些情况
//colsum[i] 0 1 2 >2
// 全为0 一个为0一个为1 两个都为1 直接break
int n = colsum.size();
int sum = 0, twosum = 0;
for(int i = 0; i < n; ++i){
if(colsum[i] == 2){
twosum++;
}
sum += colsum[i];
}
// twosum 统计的是上和下都为1 的中列数和 而upper 或者 lower都是统计 列数之和,如果那个列数之和比twosum还要大那也是不可以的 这个容易忽略 小于是可以的,因为还可能出现上为1下位0的情况,这种情况twosum是不会统计的
if(sum != upper +lower || twosum > min(upper, lower)){
return {};
}
//能走到这一步没就是可以填充矩阵了
//先把规则的给填充
upper -= twosum;
lower -= twosum;
vector<vector<int>> ans(2, vector<int>(n, 0));
for(int i = 0; i < n; ++i){
if(colsum[i] == 2){
ans[0][i] = 1;
ans[1][i] = 1;
}else if(colsum[i] == 1){
if(upper > 0){
ans[0][i] = 1;
--upper;
}else{
ans[1][i] = 1;
--lower;
}
}
}
//注意 其他未填充的都是0 ,最开始就已经初始化了
return ans;
}
};
`
小结
很巧妙的贪心算法,很想高中时候的 0 1妙用的思想